Repository: AdAstra-LD/DS-Pokemon-Rom-Editor
Branch: main
Commit: f95ab36b4290
Files: 294
Total size: 9.7 MB
Directory structure:
gitextract_awlkqn2b/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── base-build-nightly.yaml
├── .gitignore
├── DS_Map/
│ ├── App.config
│ ├── BuildingEditor.Designer.cs
│ ├── BuildingEditor.cs
│ ├── BuildingEditor.resx
│ ├── DSPRE.csproj
│ ├── DSUtils/
│ │ ├── ARM9.cs
│ │ ├── DSUtils.cs
│ │ ├── ModelUtils.cs
│ │ ├── NSBUtils.cs
│ │ └── OverlayUtils.cs
│ ├── DVCalculator/
│ │ ├── DVCalc.Designer.cs
│ │ ├── DVCalc.cs
│ │ ├── DVCalc.resx
│ │ ├── DVCalcNatureViewerForm.Designer.cs
│ │ ├── DVCalcNatureViewerForm.cs
│ │ ├── DVCalcNatureViewerForm.resx
│ │ └── DVCalculator.cs
│ ├── EditorPanels.cs
│ ├── Editors/
│ │ ├── EncountersEditor.Designer.cs
│ │ ├── EncountersEditor.cs
│ │ ├── EncountersEditor.resx
│ │ ├── HeadbuttEncounterEditor.Designer.cs
│ │ ├── HeadbuttEncounterEditor.cs
│ │ ├── HeadbuttEncounterEditor.resx
│ │ ├── HeadbuttEncounterEditorTab.Designer.cs
│ │ ├── HeadbuttEncounterEditorTab.cs
│ │ ├── HeadbuttEncounterEditorTab.resx
│ │ ├── LevelScriptEditor.Designer.cs
│ │ ├── LevelScriptEditor.cs
│ │ ├── LevelScriptEditor.resx
│ │ ├── MoveDataEditor.Designer.cs
│ │ ├── MoveDataEditor.cs
│ │ ├── MoveDataEditor.resx
│ │ ├── SafariZoneEditor.Designer.cs
│ │ ├── SafariZoneEditor.cs
│ │ ├── SafariZoneEditor.resx
│ │ ├── SafariZoneEncounterEditorTab.Designer.cs
│ │ ├── SafariZoneEncounterEditorTab.cs
│ │ ├── SafariZoneEncounterEditorTab.resx
│ │ ├── SafariZoneEncounterGroupEditor.Designer.cs
│ │ ├── SafariZoneEncounterGroupEditor.cs
│ │ ├── SafariZoneEncounterGroupEditor.resx
│ │ ├── ScriptEditor.Designer.cs
│ │ ├── ScriptEditor.cs
│ │ └── ScriptEditor.resx
│ ├── EventFileImport.Designer.cs
│ ├── EventFileImport.cs
│ ├── EventFileImport.resx
│ ├── EvolutionsEditor.cs
│ ├── EvolutionsEditor.designer.cs
│ ├── EvolutionsEditor.resx
│ ├── ExtensionMethods.cs
│ ├── Extensions.cs
│ ├── Filesystem.cs
│ ├── GameCamera.cs
│ ├── HeaderSearch.Designer.cs
│ ├── HeaderSearch.cs
│ ├── HeaderSearch.resx
│ ├── Helpers.cs
│ ├── InputComboBox.cs
│ ├── LearnsetEditor.Designer.cs
│ ├── LearnsetEditor.cs
│ ├── LearnsetEditor.resx
│ ├── LibNDSFormats/
│ │ ├── EndianBinaryReader.cs
│ │ ├── Export3DTools/
│ │ │ ├── Face.cs
│ │ │ ├── Group.cs
│ │ │ ├── OBJWriter.cs
│ │ │ ├── Polygon.cs
│ │ │ ├── PolygonType.cs
│ │ │ ├── Quad.cs
│ │ │ ├── QuadStrip.cs
│ │ │ ├── Triangle.cs
│ │ │ └── TriangleStrip.cs
│ │ ├── Helper.cs
│ │ ├── NSBCA/
│ │ │ ├── NSBCA.cs
│ │ │ └── NSBCALoader.cs
│ │ ├── NSBMD/
│ │ │ ├── MTX44.cs
│ │ │ ├── NSBMD.cs
│ │ │ ├── NSBMDAnimation.cs
│ │ │ ├── NSBMDGlRenderer.cs
│ │ │ ├── NSBMDLoader.cs
│ │ │ ├── NSBMDMaterial.cs
│ │ │ ├── NSBMDModel.cs
│ │ │ ├── NSBMDObject.cs
│ │ │ ├── NSBMDPalette.cs
│ │ │ ├── NSBMDPolygon.cs
│ │ │ └── NSBMDTexture.cs
│ │ ├── NSBTA.cs
│ │ ├── NSBTP.cs
│ │ ├── NSBTX/
│ │ │ ├── File.cs
│ │ │ ├── Filepallete.cs
│ │ │ ├── NSBTXLoader.cs
│ │ │ ├── Rom.cs
│ │ │ ├── bytearrayinputstream.cs
│ │ │ ├── directory.cs
│ │ │ ├── externalfilesystemsource.cs
│ │ │ ├── filesystem2.cs
│ │ │ ├── filesystemsource.cs
│ │ │ ├── image3d.cs
│ │ │ ├── image3dformat5.cs
│ │ │ ├── imageindexer.cs
│ │ │ ├── imagetexeler.cs
│ │ │ ├── imagetiler.cs
│ │ │ ├── inlinefile.cs
│ │ │ ├── nsbmetileset.cs
│ │ │ ├── nsbtx.cs
│ │ │ ├── palettedimage.cs
│ │ │ ├── pallete2.cs
│ │ │ └── pixelpalletedimage.cs
│ │ ├── StreamExt.cs
│ │ ├── Utils.cs
│ │ ├── bytearrayoutputstream.cs
│ │ ├── convertir.cs
│ │ └── nclr_e.cs
│ ├── Main Window.Designer.cs
│ ├── Main Window.cs
│ ├── Main Window.resx
│ ├── MessageEnc/
│ │ └── EncryptText.cs
│ ├── Narc.cs
│ ├── OffsetPictureBox.cs
│ ├── OverlayEditor.Designer.cs
│ ├── OverlayEditor.cs
│ ├── OverlayEditor.resx
│ ├── PatchToolboxDialog.Designer.cs
│ ├── PatchToolboxDialog.cs
│ ├── PatchToolboxDialog.resx
│ ├── PersonalDataEditor.Designer.cs
│ ├── PersonalDataEditor.cs
│ ├── PersonalDataEditor.resx
│ ├── PokemonEditor.Designer.cs
│ ├── PokemonEditor.cs
│ ├── PokemonEditor.resx
│ ├── Program.cs
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ ├── Settings.Designer.cs
│ │ └── Settings.settings
│ ├── ROMFiles/
│ │ ├── AreaData.cs
│ │ ├── EncounterFile.cs
│ │ ├── EventFile.cs
│ │ ├── EvolutionFile.cs
│ │ ├── GameMatrix.cs
│ │ ├── HeadbuttEncounter.cs
│ │ ├── HeadbuttEncounterFile.cs
│ │ ├── HeadbuttEncounterMap.cs
│ │ ├── HeadbuttTree.cs
│ │ ├── HeadbuttTreeGroup.cs
│ │ ├── LearnsetData.cs
│ │ ├── LevelScriptFile.cs
│ │ ├── LevelScriptTrigger.cs
│ │ ├── MapFile.cs
│ │ ├── MapHeader.cs
│ │ ├── MapScreenLoadTrigger.cs
│ │ ├── MoveData.cs
│ │ ├── PokemonPersonalData.cs
│ │ ├── RomFile.cs
│ │ ├── SafariZoneEncounter.cs
│ │ ├── SafariZoneEncounterFile.cs
│ │ ├── SafariZoneEncounterGroup.cs
│ │ ├── SafariZoneObjectRequirement.cs
│ │ ├── ScriptAction.cs
│ │ ├── ScriptActionContainer.cs
│ │ ├── ScriptCommand.cs
│ │ ├── ScriptCommandContainer.cs
│ │ ├── ScriptFile.cs
│ │ ├── ScriptReference.cs
│ │ ├── SpeciesFile.cs
│ │ ├── TextArchive.cs
│ │ ├── TrainerFile.cs
│ │ └── VariableValueTrigger.cs
│ ├── Resources/
│ │ ├── ColorTable.txt
│ │ ├── CommandsDatabase.Designer.cs
│ │ ├── CommandsDatabase.cs
│ │ ├── CommandsDatabase.resx
│ │ ├── HGSSCommands.md
│ │ ├── MovementNamesW.Designer.cs
│ │ ├── MovementNamesW.resx
│ │ ├── PokeDatabase.cs
│ │ ├── ROMToolboxDB/
│ │ │ ├── BDHCAMPatchDB.Designer.cs
│ │ │ ├── BDHCAMPatchDB.resx
│ │ │ ├── CustomScrCmdDB.resx
│ │ │ └── ToolboxDB.cs
│ │ ├── ScriptDatabase.cs
│ │ ├── ScriptsV/
│ │ │ ├── ScriptNamesB2W2.Designer.cs
│ │ │ ├── ScriptNamesB2W2.resx
│ │ │ ├── ScriptNamesB2W2J.Designer.cs
│ │ │ ├── ScriptNamesB2W2J.resx
│ │ │ ├── ScriptNamesBW.Designer.cs
│ │ │ ├── ScriptNamesBW.resx
│ │ │ ├── ScriptNamesBWJ.Designer.cs
│ │ │ ├── ScriptNamesBWJ.resx
│ │ │ ├── ScriptNamesWBW.Designer.cs
│ │ │ ├── ScriptNamesWBW.resx
│ │ │ ├── ScriptNamesWBWJ.Designer.cs
│ │ │ ├── ScriptNamesWBWJ.resx
│ │ │ ├── ScriptsB2W2.Designer.cs
│ │ │ ├── ScriptsB2W2.resx
│ │ │ ├── ScriptsB2W2J.Designer.cs
│ │ │ ├── ScriptsB2W2J.resx
│ │ │ ├── ScriptsBW.Designer.cs
│ │ │ ├── ScriptsBW.resx
│ │ │ ├── ScriptsBWJ.Designer.cs
│ │ │ └── ScriptsBWJ.resx
│ │ ├── TextDatabase.cs
│ │ ├── writeText.Designer.cs
│ │ └── writeText.resx
│ ├── RomInfo.cs
│ ├── ScintillaUtils/
│ │ ├── HotKeyManager.cs
│ │ ├── ScriptTooltip.Designer.cs
│ │ ├── ScriptTooltip.cs
│ │ ├── ScriptTooltip.resx
│ │ └── SearchManager.cs
│ ├── SpawnEditor.Designer.cs
│ ├── SpawnEditor.cs
│ ├── SpawnEditor.resx
│ ├── Themes/
│ │ └── .gitkeep
│ ├── UniqueList.cs
│ ├── WildEditorDPPt.Designer.cs
│ ├── WildEditorDPPt.cs
│ ├── WildEditorDPPt.resx
│ ├── WildEditorHGSS.Designer.cs
│ ├── WildEditorHGSS.cs
│ └── WildEditorHGSS.resx
├── DS_Map.sln
├── Ekona/
│ ├── Ekona.csproj
│ ├── EkonaLang.xml
│ ├── Helper/
│ │ ├── BinaryReaderBE.cs
│ │ ├── BinaryWriterBE.cs
│ │ ├── BitsConverter.cs
│ │ ├── CRC.cs
│ │ ├── IOutil.cs
│ │ ├── LNK.cs
│ │ └── Translation.cs
│ ├── IGamePlugin.cs
│ ├── IPlugin.cs
│ ├── IPluginHost.cs
│ ├── Images/
│ │ ├── Actions.cs
│ │ ├── Dialogs/
│ │ │ ├── OAMEditor.Designer.cs
│ │ │ ├── OAMEditor.cs
│ │ │ └── OAMEditor.resx
│ │ ├── Formats/
│ │ │ ├── ACO.cs
│ │ │ ├── APNG.cs
│ │ │ ├── Bitmap.cs
│ │ │ └── PaletteWin.cs
│ │ ├── ImageBase.cs
│ │ ├── ImageControl.cs
│ │ ├── ImageControl.designer.cs
│ │ ├── ImageControl.resx
│ │ ├── MapBase.cs
│ │ ├── NitroTextureCompressor.cs
│ │ ├── PaletteBase.cs
│ │ ├── PaletteControl.cs
│ │ ├── PaletteControl.designer.cs
│ │ ├── PaletteControl.resx
│ │ ├── RawData.cs
│ │ ├── SpriteBase.cs
│ │ ├── SpriteControl.cs
│ │ ├── SpriteControl.designer.cs
│ │ └── SpriteControl.resx
│ ├── Licence.txt
│ ├── Mathematics/
│ │ ├── NvMath.cs
│ │ └── Vector3.cs
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ └── Resources.resx
│ └── Structures.cs
├── Images/
│ ├── Images/
│ │ ├── AnimationControl.cs
│ │ ├── AnimationControl.designer.cs
│ │ ├── AnimationControl.resx
│ │ ├── DSIG.cs
│ │ ├── Images.csproj
│ │ ├── Images.xml
│ │ ├── ImagesLang.xml
│ │ ├── Licence.txt
│ │ ├── Main.cs
│ │ ├── NANR.cs
│ │ ├── NCCG.cs
│ │ ├── NCCL.cs
│ │ ├── NCE.cs
│ │ ├── NCER.cs
│ │ ├── NCGR.cs
│ │ ├── NCLR.cs
│ │ ├── NCOB.cs
│ │ ├── NCSC.cs
│ │ ├── NSCR.cs
│ │ └── Properties/
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ └── Resources.resx
│ └── Images.sln
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .github/workflows/base-build-nightly.yaml
================================================
name: DSPRE Canary Build
on:
push:
branches:
- main # Trigger only on pushes to the main branch
permissions:
contents: write
env:
SOLUTION_FILE_PATH: DS_Map.sln
BUILD_CONFIGURATION: Release
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.0.2
- name: Restore NuGet packages
working-directory: ${{env.GITHUB_WORKSPACE}}
run: nuget restore ${{env.SOLUTION_FILE_PATH}}
- name: Build DSPRE
working-directory: ${{env.GITHUB_WORKSPACE}}
run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
- name: Zip Release Files
run: Compress-Archive -Path ${{env.GITHUB_WORKSPACE}}DS_Map\bin\Release -DestinationPath DSPRE-canary.zip
- name: Fetch tags
run: git fetch --prune --unshallow --tags
- name: Delete previous release
run: |
gh release delete --yes canary
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
- name: Create new release
uses: softprops/action-gh-release@v2
with:
tag_name: canary
name: DSPRE Canary Build ${{ steps.date.outputs.date }}
files: DSPRE-canary.zip
token: ${{ secrets.GITHUB_TOKEN }}
prerelease: true
generate_release_notes: true
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
================================================
FILE: DS_Map/App.config
================================================
2
False
0
True
True
True
True
================================================
FILE: DS_Map/BuildingEditor.Designer.cs
================================================
namespace DSPRE
{
partial class BuildingEditor
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.textureComboBox = new System.Windows.Forms.ComboBox();
this.importButton = new System.Windows.Forms.Button();
this.exportButton = new System.Windows.Forms.Button();
this.buildingOpenGLControl = new Tao.Platform.Windows.SimpleOpenGlControl();
this.interiorCheckBox = new System.Windows.Forms.CheckBox();
this.buildingEditorBldListBox = new System.Windows.Forms.ListBox();
this.panel1 = new System.Windows.Forms.Panel();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
this.label1 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
this.SuspendLayout();
//
// textureComboBox
//
this.textureComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.textureComboBox.FormattingEnabled = true;
this.textureComboBox.Location = new System.Drawing.Point(657, 520);
this.textureComboBox.Name = "textureComboBox";
this.textureComboBox.Size = new System.Drawing.Size(158, 21);
this.textureComboBox.TabIndex = 25;
this.textureComboBox.SelectedIndexChanged += new System.EventHandler(this.textureComboBox_SelectedIndexChanged);
//
// importButton
//
this.importButton.Image = global::DSPRE.Properties.Resources.importArrow;
this.importButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.importButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.importButton.Location = new System.Drawing.Point(12, 505);
this.importButton.Name = "importButton";
this.importButton.Size = new System.Drawing.Size(111, 36);
this.importButton.TabIndex = 23;
this.importButton.Text = "Import NSBMD";
this.importButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.importButton.UseVisualStyleBackColor = true;
this.importButton.Click += new System.EventHandler(this.importButton_Click);
//
// exportButton
//
this.exportButton.Image = global::DSPRE.Properties.Resources.exportArrow;
this.exportButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.exportButton.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.exportButton.Location = new System.Drawing.Point(124, 505);
this.exportButton.Name = "exportButton";
this.exportButton.Size = new System.Drawing.Size(111, 36);
this.exportButton.TabIndex = 22;
this.exportButton.Text = "Export NSBMD";
this.exportButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.exportButton.UseVisualStyleBackColor = true;
this.exportButton.Click += new System.EventHandler(this.exportButton_Click);
//
// buildingOpenGLControl
//
this.buildingOpenGLControl.AccumBits = ((byte)(0));
this.buildingOpenGLControl.AutoCheckErrors = false;
this.buildingOpenGLControl.AutoFinish = false;
this.buildingOpenGLControl.AutoMakeCurrent = true;
this.buildingOpenGLControl.AutoSwapBuffers = true;
this.buildingOpenGLControl.BackColor = System.Drawing.Color.Black;
this.buildingOpenGLControl.ColorBits = ((byte)(32));
this.buildingOpenGLControl.DepthBits = ((byte)(24));
this.buildingOpenGLControl.Location = new System.Drawing.Point(3, 7);
this.buildingOpenGLControl.Name = "buildingOpenGLControl";
this.buildingOpenGLControl.Size = new System.Drawing.Size(500, 500);
this.buildingOpenGLControl.StencilBits = ((byte)(0));
this.buildingOpenGLControl.TabIndex = 21;
this.buildingOpenGLControl.KeyUp += new System.Windows.Forms.KeyEventHandler(this.buildingOpenGLControl_KeyUp);
this.buildingOpenGLControl.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.buildingOpenGLControl_PreviewKeyDown);
//
// interiorCheckBox
//
this.interiorCheckBox.AutoSize = true;
this.interiorCheckBox.Enabled = false;
this.interiorCheckBox.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.interiorCheckBox.Location = new System.Drawing.Point(312, 522);
this.interiorCheckBox.Name = "interiorCheckBox";
this.interiorCheckBox.Size = new System.Drawing.Size(114, 17);
this.interiorCheckBox.TabIndex = 20;
this.interiorCheckBox.Text = "Interior Models List";
this.interiorCheckBox.UseVisualStyleBackColor = true;
this.interiorCheckBox.CheckedChanged += new System.EventHandler(this.interiorCheckBox_CheckedChanged);
//
// buildingEditorBldListBox
//
this.buildingEditorBldListBox.FormattingEnabled = true;
this.buildingEditorBldListBox.Location = new System.Drawing.Point(12, 12);
this.buildingEditorBldListBox.Name = "buildingEditorBldListBox";
this.buildingEditorBldListBox.Size = new System.Drawing.Size(291, 485);
this.buildingEditorBldListBox.TabIndex = 19;
this.buildingEditorBldListBox.SelectedIndexChanged += new System.EventHandler(this.buildingEditorListBox_SelectedIndexChanged);
//
// panel1
//
this.panel1.Controls.Add(this.buildingOpenGLControl);
this.panel1.Location = new System.Drawing.Point(309, 4);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(507, 512);
this.panel1.TabIndex = 26;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(538, 524);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(113, 13);
this.label1.TabIndex = 27;
this.label1.Text = "Texture Pack Selector";
//
// button1
//
this.button1.Image = global::DSPRE.Properties.Resources.exportArrow;
this.button1.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.button1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.button1.Location = new System.Drawing.Point(236, 505);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(67, 36);
this.button1.TabIndex = 28;
this.button1.Text = "DAE";
this.button1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.bldExportDAEbutton_Click);
//
// BuildingEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(825, 545);
this.Controls.Add(this.button1);
this.Controls.Add(this.label1);
this.Controls.Add(this.panel1);
this.Controls.Add(this.textureComboBox);
this.Controls.Add(this.importButton);
this.Controls.Add(this.exportButton);
this.Controls.Add(this.interiorCheckBox);
this.Controls.Add(this.buildingEditorBldListBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Name = "BuildingEditor";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Building Editor";
this.panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox textureComboBox;
private System.Windows.Forms.Button importButton;
private System.Windows.Forms.Button exportButton;
private Tao.Platform.Windows.SimpleOpenGlControl buildingOpenGLControl;
private System.Windows.Forms.CheckBox interiorCheckBox;
private System.Windows.Forms.ListBox buildingEditorBldListBox;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.BindingSource bindingSource1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
}
}
================================================
FILE: DS_Map/BuildingEditor.cs
================================================
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using LibNDSFormats.NSBMD;
using LibNDSFormats.NSBTX;
using Microsoft.WindowsAPICodePack.Dialogs;
using Tao.OpenGl;
using static DSPRE.RomInfo;
namespace DSPRE {
public partial class BuildingEditor : Form {
#region Variables
public static string temp_btxname = "BLDtexture.nsbtx";
private readonly string folder;
bool disableHandlers = new bool();
readonly RomInfo rom;
NSBMD currentNSBMD;
byte[] currentModelData;
readonly NSBMDGlRenderer renderer = new NSBMDGlRenderer();
public static float ang = 0.0f;
public static float dist = 12.8f;
public static float elev = 50.0f;
public static float tempAng = 0.0f;
public static float tempDist = 0.0f;
public static float tempElev = 0.0f;
public float perspective = 45f;
/* Bld Rotation vars */
public bool lRot;
public bool rRot;
public bool uRot;
public bool dRot;
#endregion
public BuildingEditor(RomInfo romInfo) {
InitializeComponent();
rom = romInfo;
buildingOpenGLControl.InitializeContexts();
buildingOpenGLControl.MakeCurrent();
buildingOpenGLControl.MouseWheel += new MouseEventHandler(buildingOpenGLControl_MouseWheel);
Gl.glEnable(Gl.GL_TEXTURE_2D);
if (RomInfo.gameFamily == GameFamilies.HGSS) {
interiorCheckBox.Enabled = true;
}
Helpers.DisableHandlers();
FillListBox(false);
FillTexturesBox();
textureComboBox.SelectedIndex = 0;
Helpers.EnableHandlers();
buildingEditorBldListBox.SelectedIndex = 0;
}
#region Subroutines
private void CreateEmbeddedTexturesFile(int modelID, bool interior) {
string readingPath = folder + rom.GetBuildingModelsDirPath(interior) + "\\" + modelID.ToString("D4");
byte[] txFile = File.ReadAllBytes(readingPath);
byte[] texData = NSBUtils.GetTexturesFromTexturedNSBMD(txFile);
if (texData.Length <= 4) {
Console.WriteLine("No textures found");
return;
}
DSUtils.WriteToFile(Path.GetTempPath() + temp_btxname, texData, fmode: FileMode.Create);
}
private void FillListBox(bool interior) {
int modelCount = Directory.GetFiles(folder + rom.GetBuildingModelsDirPath(interior)).Length;
for (int currentIndex = 0; currentIndex < modelCount; currentIndex++) {
string filePath = folder + rom.GetBuildingModelsDirPath(interior) + "\\" + currentIndex.ToString("D4");
using (DSUtils.EasyReader reader = new DSUtils.EasyReader(filePath, 0x14)) {
string nsbmdName = NSBUtils.ReadNSBMDname(reader);
buildingEditorBldListBox.Items.Add("[" + currentIndex.ToString("D3") + "] " + nsbmdName);
}
}
}
private void FillTexturesBox() {
int texturesCount = Directory.GetFiles(folder + RomInfo.gameDirs[DirNames.buildingTextures].unpackedDir).Length;
textureComboBox.Items.Add("Embedded textures");
for (int i = 0; i < texturesCount; i++) {
textureComboBox.Items.Add("Texture " + i);
}
}
private void LoadModelTextures(int fileID) {
string path;
if (fileID > -1) {
path = folder + RomInfo.gameDirs[RomInfo.DirNames.buildingTextures].unpackedDir + "\\" + fileID.ToString("D4");
} else {
path = Path.GetTempPath() + temp_btxname; // Load Embedded textures if the argument passed to this function is -1
}
try {
currentNSBMD.materials = NSBTXLoader.LoadNsbtx(new MemoryStream(File.ReadAllBytes(path)), out currentNSBMD.Textures, out currentNSBMD.Palettes);
currentNSBMD.MatchTextures();
} catch { }
}
private void RenderModel() {
MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File bta = new MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File();
MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File btp = new MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File();
MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File bca = new MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File();
int[] aniframeS = new int[0];
buildingOpenGLControl.Invalidate(); // Invalidate drawing surface
SetupRenderer(ang, dist, elev, perspective); // Adjust rendering settings
/* Render the building model */
renderer.Model = currentNSBMD.models[0];
Gl.glScalef(currentNSBMD.models[0].modelScale / 32, currentNSBMD.models[0].modelScale / 32, currentNSBMD.models[0].modelScale / 32);
renderer.RenderModel("", bta, aniframeS, aniframeS, aniframeS, aniframeS, aniframeS, bca, false, -1, 0.0f, 0.0f, dist, elev, ang, true, btp, currentNSBMD);
}
private void SetupRenderer(float ang, float dist, float elev, float perspective) {
Gl.glEnable(Gl.GL_RESCALE_NORMAL);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_NORMALIZE);
Gl.glDisable(Gl.GL_CULL_FACE);
Gl.glFrontFace(Gl.GL_CCW);
Gl.glClearDepth(1);
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
Gl.glEnable(Gl.GL_BLEND);
Gl.glAlphaFunc(Gl.GL_GREATER, 0f);
Gl.glClearColor(51f / 255f, 51f / 255f, 51f / 255f, 1f);
float aspect;
Gl.glViewport(0, 0, buildingOpenGLControl.Width, buildingOpenGLControl.Height);
aspect = buildingOpenGLControl.Width / buildingOpenGLControl.Height;//(vp[2] - vp[0]) / (vp[3] - vp[1]);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(perspective, aspect, 0.2f, 500.0f);//0.02f, 32.0f);
Gl.glTranslatef(0, 0, -dist);
Gl.glRotatef(elev, 1, 0, 0);
Gl.glRotatef(ang, 0, 1, 0);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glTranslatef(0, 0, -dist);
Gl.glRotatef(elev, 1, 0, 0);
Gl.glRotatef(-ang, 0, 1, 0);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLoadIdentity();
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
Gl.glColor3f(1.0f, 1.0f, 1.0f);
Gl.glDepthMask(Gl.GL_TRUE);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
}
#endregion
private void buildingOpenGLControl_MouseWheel(object sender, MouseEventArgs e) { // Zoom In/Out
float val = (float)e.Delta / 200;
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) {
dist += val;
} else {
dist -= val;
}
RenderModel();
}
private void buildingEditorListBox_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled || buildingEditorBldListBox.SelectedIndex < 0) {
return;
}
string path = folder + rom.GetBuildingModelsDirPath(interiorCheckBox.Checked) + "\\" + buildingEditorBldListBox.SelectedIndex.ToString("D4");
currentModelData = File.ReadAllBytes(path);
currentNSBMD = NSBMDLoader.LoadNSBMD(new MemoryStream(currentModelData));
CreateEmbeddedTexturesFile(buildingEditorBldListBox.SelectedIndex, interiorCheckBox.Checked);
LoadModelTextures(textureComboBox.SelectedIndex - 1);
RenderModel();
}
private void exportButton_Click(object sender, EventArgs e) {
SaveFileDialog em = new SaveFileDialog {
Filter = "NSBMD model (*.nsbmd)|*.nsbmd",
FileName = buildingEditorBldListBox.SelectedItem.ToString()
};
if (em.ShowDialog(this) != DialogResult.OK) {
return;
}
File.Copy(folder + rom.GetBuildingModelsDirPath(interiorCheckBox.Checked) + "\\" + buildingEditorBldListBox.SelectedIndex.ToString("D4"), em.FileName, true);
}
private void importButton_Click(object sender, EventArgs e) {
OpenFileDialog im = new OpenFileDialog {
Filter = "NSBMD model (*.nsbmd)|*.nsbmd"
};
if (im.ShowDialog(this) != DialogResult.OK) {
return;
}
using (DSUtils.EasyReader reader = new DSUtils.EasyReader(im.FileName)) {
if (reader.ReadUInt32() != NSBMD.NDS_TYPE_BMD0) {
MessageBox.Show("Please select an NSBMD file.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} else {
int currentIndex = buildingEditorBldListBox.SelectedIndex;
File.Copy(im.FileName, folder + rom.GetBuildingModelsDirPath(interiorCheckBox.Checked) + "\\" + currentIndex.ToString("D4"), true);
buildingEditorBldListBox.Items[currentIndex] = "[" + currentIndex.ToString("D3") + "] " + NSBUtils.ReadNSBMDname(reader, 0x14);
buildingEditorListBox_SelectedIndexChanged(null, null);
}
}
}
private void interiorCheckBox_CheckedChanged(object sender, EventArgs e) {
Helpers.DisableHandlers();
buildingEditorBldListBox.Items.Clear();
FillListBox(interiorCheckBox.Checked);
Helpers.EnableHandlers();
buildingEditorBldListBox.SelectedIndex = 0;
}
private void textureComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled) {
return;
}
LoadModelTextures(textureComboBox.SelectedIndex - 1);
RenderModel();
}
private void buildingOpenGLControl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
byte multiplier = 2;
if (e.Modifiers == Keys.Shift) {
multiplier = 1;
} else if (e.Modifiers == Keys.Control) {
multiplier = 4;
}
switch (e.KeyCode) {
case Keys.Right:
rRot = true;
lRot = false;
break;
case Keys.Left:
rRot = false;
lRot = true;
break;
case Keys.Up:
dRot = false;
uRot = true;
break;
case Keys.Down:
dRot = true;
uRot = false;
break;
}
if (rRot ^ lRot) {
if (rRot) {
ang += 1 * multiplier;
} else if (lRot) {
ang -= 1 * multiplier;
}
}
if (uRot ^ dRot) {
if (uRot) {
elev -= 1 * multiplier;
} else if (dRot) {
elev += 1 * multiplier;
}
}
RenderModel();
}
private void bldExportDAEbutton_Click(object sender, EventArgs e) {
ModelUtils.ModelToDAE(
modelName: buildingEditorBldListBox.SelectedItem.ToString().TrimEnd('\0'),
modelData: currentModelData,
textureData: textureComboBox.SelectedIndex < 1 ? null : File.ReadAllBytes(RomInfo.gameDirs[DirNames.buildingTextures].unpackedDir + "\\" + (textureComboBox.SelectedIndex - 1).ToString("D4"))
);
}
private void buildingOpenGLControl_KeyUp(object sender, KeyEventArgs e) {
switch (e.KeyCode) {
case Keys.Right:
rRot = false;
break;
case Keys.Left:
lRot = false;
break;
case Keys.Up:
uRot = false;
break;
case Keys.Down:
dRot = false;
break;
}
}
}
}
================================================
FILE: DS_Map/BuildingEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
17, 17
25
================================================
FILE: DS_Map/DSPRE.csproj
================================================
Debug
AnyCPU
{E3C66521-EE89-4406-92C4-FC1D40DC4200}
WinExe
DSPRE
DSPRE
v4.8
512
true
false
publish\
true
Disk
false
Foreground
7
Days
false
false
true
0
1.4.1.%2a
false
true
AnyCPU
true
full
false
bin\Debug\
DEBUG;TRACE
prompt
4
true
false
false
AnyCPU
none
true
bin\Release\
TRACE
prompt
4
true
true
false
false
app.ico
False
.\HelixToolkit.dll
False
..\..\..\..\..\Desktop\sdsme\Map_Editor\OpenTK.dll
False
..\..\..\..\..\Desktop\sdsme\Map_Editor\Tao.OpenGl.dll
False
..\..\..\..\..\Desktop\sdsme\Map_Editor\Tao.Platform.Windows.dll
Form
Form
UserControl
EncountersEditor.cs
UserControl
HeadbuttEncounterEditor.cs
UserControl
HeadbuttEncounterEditorTab.cs
UserControl
LevelScriptEditor.cs
Form
MoveDataEditor.cs
UserControl
SafariZoneEditor.cs
UserControl
SafariZoneEncounterEditorTab.cs
UserControl
SafariZoneEncounterGroupEditor.cs
UserControl
ScriptEditor.cs
Form
EventFileImport.cs
Form
EvolutionsEditor.cs
Component
Form
LearnsetEditor.cs
Form
OverlayEditor.cs
Form
PersonalDataEditor.cs
Form
PokemonEditor.cs
True
True
Resources.resx
Form
CommandsDatabase.cs
True
True
BDHCAMPatchDB.resx
Form
HeaderSearch.cs
Component
Form
PatchToolboxDialog.cs
Form
BuildingEditor.cs
Form
ScriptTooltip.cs
Form
SpawnEditor.cs
Form
WildEditorHGSS.cs
Form
WildEditorDPPt.cs
Form
Form
Main Window.cs
EncountersEditor.cs
HeadbuttEncounterEditor.cs
HeadbuttEncounterEditorTab.cs
LevelScriptEditor.cs
MoveDataEditor.cs
SafariZoneEditor.cs
SafariZoneEncounterEditorTab.cs
SafariZoneEncounterGroupEditor.cs
ScriptEditor.cs
EventFileImport.cs
EvolutionsEditor.cs
HeaderSearch.cs
LearnsetEditor.cs
OverlayEditor.cs
PersonalDataEditor.cs
PokemonEditor.cs
ResXFileCodeGenerator
BDHCAMPatchDB.Designer.cs
Designer
CommandsDatabase.cs
Designer
PatchToolboxDialog.cs
BuildingEditor.cs
ScriptTooltip.cs
SpawnEditor.cs
WildEditorHGSS.cs
Main Window.cs
Designer
ResXFileCodeGenerator
Designer
Resources.Designer.cs
WildEditorDPPt.cs
SettingsSingleFileGenerator
Settings.Designer.cs
True
Settings.settings
True
Always
Always
Always
False
Microsoft .NET Framework 4.5.2 %28x86 e x64%29
true
False
.NET Framework 3.5 SP1
false
{736010d3-f72f-4c56-b8d2-2edd1b8f3a87}
Ekona
{8bb5da4b-5b71-4993-8941-4f38d4e6c81b}
Images
3.6.3
1.1.0.2
1.1.0
4.3.0
================================================
FILE: DS_Map/DSUtils/ARM9.cs
================================================
using System;
using System.Diagnostics;
using System.IO;
using static DSPRE.RomInfo;
namespace DSPRE {
public static class ARM9 {
private const int MAX_SIZE = 0xBC000;
public static readonly uint address = 0x02000000;
public class Reader : DSUtils.EasyReader {
public Reader(long pos = 0) : base(arm9Path, pos) {
this.BaseStream.Position = pos;
}
}
public class Writer : DSUtils.EasyWriter {
public Writer(long pos = 0) : base(arm9Path, pos) {
this.BaseStream.Position = pos;
}
}
public static void EditSize(int increment) {
using (Writer w = new Writer()) {
w.EditSize(increment);
}
}
public static bool Decompress(string path) {
Process decompress = DSUtils.CreateDecompressProcess(path);
decompress.Start();
decompress.WaitForExit();
return new FileInfo(path).Length > MAX_SIZE;
}
public static bool Compress(string path) {
Process compress = new Process();
compress.StartInfo.FileName = @"Tools\blz.exe";
compress.StartInfo.Arguments = @" -en9 " + '"' + path + '"';
compress.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
compress.StartInfo.CreateNoWindow = true;
compress.Start();
compress.WaitForExit();
return new FileInfo(path).Length <= MAX_SIZE;
}
public static bool CheckCompressionMark() {
return BitConverter.ToInt32(ReadBytes((uint)(RomInfo.gameFamily == GameFamilies.DP ? 0xB7C : 0xBB4), 4), 0) != 0;
}
public static byte[] ReadBytes(uint startOffset, long numberOfBytes = 0) {
return DSUtils.ReadFromFile(RomInfo.arm9Path, startOffset, numberOfBytes);
}
public static void WriteBytes(byte[] bytesToWrite, uint destOffset, int indexFirstByteToWrite = 0, int? indexLastByteToWrite = null) {
DSUtils.WriteToFile(RomInfo.arm9Path, bytesToWrite, destOffset, indexFirstByteToWrite, indexLastByteToWrite);
}
public static byte ReadByte(uint startOffset) {
return DSUtils.ReadFromFile(RomInfo.arm9Path, startOffset, 1)[0];
}
public static void WriteByte(byte value, uint destOffset) {
DSUtils.WriteToFile(RomInfo.arm9Path, BitConverter.GetBytes(value), destOffset, 0);
}
}
}
================================================
FILE: DS_Map/DSUtils/DSUtils.cs
================================================
using Ekona.Images;
using Images;
using LibNDSFormats.NSBMD;
using Microsoft.WindowsAPICodePack.Dialogs;
using NarcAPI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static DSPRE.RomInfo;
namespace DSPRE {
public static class DSUtils {
public const int ERR_OVERLAY_NOTFOUND = -1;
public const int ERR_OVERLAY_ALREADY_UNCOMPRESSED = -2;
public const string backupSuffix = ".backup";
public static readonly string NDSRomFilter = "NDS File (*.nds)|*.nds";
public class EasyReader : BinaryReader {
public EasyReader(string path, long pos = 0) : base(File.OpenRead(path)) {
this.BaseStream.Position = pos;
}
}
public class EasyWriter : BinaryWriter {
public EasyWriter(string path, long pos = 0, FileMode fmode = FileMode.OpenOrCreate) : base(new FileStream(path, fmode, FileAccess.Write, FileShare.None)) {
this.BaseStream.Position = pos;
}
public void EditSize(int increment) {
this.BaseStream.SetLength(this.BaseStream.Length + increment);
}
}
public static void WriteToFile(string filepath, byte[] toOutput, uint writeAt = 0, int indexFirstByteToWrite = 0, int? indexLastByteToWrite = null, FileMode fmode = FileMode.OpenOrCreate) {
using (EasyWriter writer = new EasyWriter(filepath, writeAt, fmode)) {
writer.Write(toOutput, indexFirstByteToWrite, indexLastByteToWrite is null ? toOutput.Length - indexFirstByteToWrite : (int)indexLastByteToWrite);
}
}
public static byte[] ReadFromFile(string filepath, long startOffset = 0, long numberOfBytes = 0) {
byte[] buffer = null;
using (EasyReader reader = new EasyReader(filepath, startOffset)) {
try {
buffer = reader.ReadBytes(numberOfBytes == 0 ? (int)(reader.BaseStream.Length - reader.BaseStream.Position) : (int)numberOfBytes);
} catch (EndOfStreamException) {
Console.WriteLine("Stream ended");
}
}
return buffer;
}
public static byte[] ReadFromByteArray(byte[] input, long readFrom = 0, long numberOfBytes = 0) {
byte[] buffer = null;
using (BinaryReader reader = new BinaryReader(new MemoryStream(input))) {
reader.BaseStream.Position = readFrom;
try {
if (numberOfBytes == 0) {
buffer = reader.ReadBytes((int)(input.Length - reader.BaseStream.Position));
} else {
buffer = reader.ReadBytes((int)numberOfBytes);
}
} catch (EndOfStreamException) {
Console.WriteLine("Stream ended");
}
}
return buffer;
}
public static Process CreateDecompressProcess(string path) {
Process decompress = new Process();
decompress.StartInfo.FileName = @"Tools\blz.exe";
decompress.StartInfo.Arguments = @" -d " + '"' + path + '"';
decompress.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
decompress.StartInfo.CreateNoWindow = true;
return decompress;
}
public static void RepackROM(string ndsFileName) {
Process repack = new Process();
repack.StartInfo.FileName = @"Tools\ndstool.exe";
repack.StartInfo.Arguments = "-c " + '"' + ndsFileName + '"'
+ " -9 " + '"' + RomInfo.arm9Path + '"'
+ " -7 " + '"' + RomInfo.workDir + "arm7.bin" + '"'
+ " -y9 " + '"' + RomInfo.workDir + "y9.bin" + '"'
+ " -y7 " + '"' + RomInfo.workDir + "y7.bin" + '"'
+ " -d " + '"' + RomInfo.workDir + "data" + '"'
+ " -y " + '"' + RomInfo.workDir + "overlay" + '"'
+ " -t " + '"' + RomInfo.workDir + "banner.bin" + '"'
+ " -h " + '"' + RomInfo.workDir + "header.bin" + '"';
Application.DoEvents();
repack.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
repack.StartInfo.CreateNoWindow = true;
repack.Start();
repack.WaitForExit();
}
public static byte[] StringToByteArray(String hex) {
//Ummm what?
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}
public static byte[] HexStringToByteArray(string hexString) {
//FC B5 05 48 C0 46 41 21
//09 22 02 4D A8 47 00 20
//03 21 FC BD F1 64 00 02
//00 80 3C 02
if (hexString is null)
return null;
hexString = hexString.Trim();
byte[] b = new byte[hexString.Length / 3 + 1];
for (int i = 0; i < hexString.Length; i += 2) {
if (hexString[i] == ' ') {
hexString = hexString.Substring(1, hexString.Length - 1);
}
b[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}
return b;
}
public static void TryUnpackNarcs(List IDs) {
if (gameDirs == null || gameDirs.Count == 0) {
return;
}
Parallel.ForEach(IDs, id => {
if (gameDirs.TryGetValue(id, out (string packedPath, string unpackedPath) paths)) {
DirectoryInfo di = new DirectoryInfo(paths.unpackedPath);
if (!di.Exists || di.GetFiles().Length == 0) {
Narc opened = Narc.Open(paths.packedPath) ?? throw new NullReferenceException();
opened.ExtractToFolder(paths.unpackedPath);
}
}
});
}
public static void ForceUnpackNarcs(List IDs) {
Parallel.ForEach(IDs, id => {
if (gameDirs.TryGetValue(id, out (string packedPath, string unpackedPath) paths)) {
Narc opened = Narc.Open(paths.packedPath);
if (opened is null) {
throw new NullReferenceException();
}
opened.ExtractToFolder(paths.unpackedPath);
}
});
}
public static Image GetPokePic(int species, int w, int h) {
PaletteBase paletteBase;
bool fiveDigits = false; // some extreme future proofing
string filename = "0000";
try {
paletteBase = new NCLR(gameDirs[DirNames.monIcons].unpackedDir + "\\" + filename, 0, filename);
} catch (FileNotFoundException) {
filename += '0';
paletteBase = new NCLR(gameDirs[DirNames.monIcons].unpackedDir + "\\" + filename, 0, filename);
fiveDigits = true;
}
// read arm9 table to grab pal ID
int paletteId = 0;
string iconTablePath;
int iconPalTableOffsetFromFileStart;
string ov129path = OverlayUtils.GetPath(129);
if (File.Exists(ov129path)) {
// if overlay 129 exists, read it from there
iconPalTableOffsetFromFileStart = (int)(RomInfo.monIconPalTableAddress - OverlayUtils.OverlayTable.GetRAMAddress(129));
iconTablePath = ov129path;
} else if ((int)(RomInfo.monIconPalTableAddress - RomInfo.synthOverlayLoadAddress) >= 0) {
// if there is a synthetic overlay, read it from there
iconPalTableOffsetFromFileStart = (int)(RomInfo.monIconPalTableAddress - RomInfo.synthOverlayLoadAddress);
iconTablePath = gameDirs[DirNames.synthOverlay].unpackedDir + "\\" + PatchToolboxDialog.expandedARMfileID.ToString("D4");
} else {
// default handling
iconPalTableOffsetFromFileStart = (int)(RomInfo.monIconPalTableAddress - ARM9.address);
iconTablePath = RomInfo.arm9Path;
}
using (DSUtils.EasyReader idReader = new DSUtils.EasyReader(iconTablePath, iconPalTableOffsetFromFileStart + species)) {
paletteId = idReader.ReadByte();
}
if (paletteId != 0) {
paletteBase.Palette[0] = paletteBase.Palette[paletteId]; // update pal 0 to be the new pal
}
// grab tiles
int spriteFileID = species + 7;
string spriteFilename = spriteFileID.ToString("D" + (fiveDigits ? "5" : "4"));
ImageBase imageBase = new NCGR(gameDirs[DirNames.monIcons].unpackedDir + "\\" + spriteFilename, spriteFileID, spriteFilename);
// grab sprite
int ncerFileId = 2;
string ncerFileName = ncerFileId.ToString("D" + (fiveDigits ? "5" : "4"));
SpriteBase spriteBase = new NCER(gameDirs[DirNames.monIcons].unpackedDir + "\\" + ncerFileName, 2, ncerFileName);
// copy this from the trainer
int bank0OAMcount = spriteBase.Banks[0].oams.Length;
int[] OAMenabled = new int[bank0OAMcount];
for (int i = 0; i < OAMenabled.Length; i++) {
OAMenabled[i] = i;
}
// finally compose image
try {
return spriteBase.Get_Image(imageBase, paletteBase, 0, w, h, false, false, false, true, true, -1, OAMenabled);
} catch (FormatException) {
return Properties.Resources.IconPokeball;
}
}
}
}
================================================
FILE: DS_Map/DSUtils/ModelUtils.cs
================================================
using Microsoft.WindowsAPICodePack.Dialogs;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace DSPRE {
public static class ModelUtils {
public static void ModelToDAE(string modelName, byte[] modelData, byte[] textureData) {
MessageBox.Show("Choose output folder.\nDSPRE will automatically create a sub-folder in it.", "Awaiting user input", MessageBoxButtons.OK, MessageBoxIcon.Information);
CommonOpenFileDialog cofd = new CommonOpenFileDialog {
IsFolderPicker = true,
Multiselect = false
};
if (cofd.ShowDialog() != CommonFileDialogResult.Ok) {
return;
}
string outDir = Path.Combine(cofd.FileName, modelName);
if (Directory.Exists(outDir)) {
if (Directory.GetFiles(outDir).Length > 0) {
DialogResult d = MessageBox.Show($"Directory \"{outDir}\" already exists and is not empty.\nIts contents will be lost.\n\nDo you want to proceed?", "Directory not empty", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (d.Equals(DialogResult.No)) {
return;
} else {
Directory.Delete(outDir, recursive: true);
}
} else {
Directory.Delete(outDir, recursive: true);
}
}
string tempNSBMDPath = outDir + "_temp.nsbmd";
if (textureData != null && textureData.Length > 0) {
modelData = NSBUtils.BuildNSBMDwithTextures(modelData, textureData);
}
File.WriteAllBytes(tempNSBMDPath, modelData);
/* Check correct creation of temp NSBMD file*/
if (!File.Exists(tempNSBMDPath)) {
MessageBox.Show("Expected NSBMD file could not be found.\nAborting", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
Process apicula = new Process();
apicula.StartInfo.FileName = @"Tools\apicula.exe";
apicula.StartInfo.Arguments = $" convert \"{tempNSBMDPath}\" --output \"{outDir}\"";
apicula.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
apicula.StartInfo.CreateNoWindow = true;
apicula.Start();
apicula.WaitForExit();
if (File.Exists(tempNSBMDPath)) {
File.Delete(tempNSBMDPath);
if (File.Exists(tempNSBMDPath)) {
MessageBox.Show("Temporary NSBMD file deletion failed.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
} else {
MessageBox.Show("Temporary NSBMD file corresponding to this map disappeared.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
if (apicula.ExitCode == 0) {
MessageBox.Show("NSBMD was exported and converted successfully!", "Operation successful", MessageBoxButtons.OK, MessageBoxIcon.Information);
} else {
MessageBox.Show("NSBMD to DAE conversion failed.", "Apicula error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public static void ModelToGLB(string modelName, byte[] modelData, byte[] textureData) {
MessageBox.Show("Choose output folder.\nDSPRE will automatically create a sub-folder in it.", "Awaiting user input", MessageBoxButtons.OK, MessageBoxIcon.Information);
CommonOpenFileDialog cofd = new CommonOpenFileDialog {
IsFolderPicker = true,
Multiselect = false
};
if (cofd.ShowDialog() != CommonFileDialogResult.Ok) {
return;
}
string outDir = Path.Combine(cofd.FileName, modelName);
if (Directory.Exists(outDir)) {
if (Directory.GetFiles(outDir).Length > 0) {
DialogResult d = MessageBox.Show($"Directory \"{outDir}\" already exists and is not empty.\nIts contents will be lost.\n\nDo you want to proceed?", "Directory not empty", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (d.Equals(DialogResult.No)) {
return;
} else {
Directory.Delete(outDir, recursive: true);
}
} else {
Directory.Delete(outDir, recursive: true);
}
}
string tempNSBMDPath = outDir + "_temp.nsbmd";
if (textureData != null && textureData.Length > 0) {
modelData = NSBUtils.BuildNSBMDwithTextures(modelData, textureData);
}
File.WriteAllBytes(tempNSBMDPath, modelData);
/* Check correct creation of temp NSBMD file*/
if (!File.Exists(tempNSBMDPath)) {
MessageBox.Show("NSBMD file corresponding to this map could not be found.\nAborting", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
Process apicula = new Process();
apicula.StartInfo.FileName = @"Tools\apicula.exe";
apicula.StartInfo.Arguments = $" convert \"{tempNSBMDPath}\" -f glb --output \"{outDir}\"";
apicula.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
apicula.StartInfo.CreateNoWindow = true;
apicula.Start();
apicula.WaitForExit();
if (File.Exists(tempNSBMDPath)) {
File.Delete(tempNSBMDPath);
if (File.Exists(tempNSBMDPath)) {
MessageBox.Show("Temporary NSBMD file deletion failed.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
} else {
MessageBox.Show("Temporary NSBMD file corresponding to this map disappeared.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
if (apicula.ExitCode == 0) {
MessageBox.Show("NSBMD was exported and converted successfully!", "Operation successful", MessageBoxButtons.OK, MessageBoxIcon.Information);
} else {
MessageBox.Show("NSBMD to GLB conversion failed.", "Apicula error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
================================================
FILE: DS_Map/DSUtils/NSBUtils.cs
================================================
using LibNDSFormats.NSBMD;
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace DSPRE {
public static class NSBUtils {
public const int NSBMD_DOESNTHAVE_TEXTURE = 0;
public const int NSBMD_HAS_TEXTURE = 1;
public static string ReadNSBMDname(BinaryReader reader, long? startPos = null) {
if (startPos != null) {
reader.BaseStream.Position = (long)startPos;
}
if (reader.ReadUInt32() == NSBMD.NDS_TYPE_MDL0) { //MDL0
reader.BaseStream.Position += 0x1c;
} else {
reader.BaseStream.Position += 0x1c + 4;
}
return Encoding.UTF8.GetString(reader.ReadBytes(16));
}
public static byte[] BuildNSBMDwithTextures(byte[] nsbmd, byte[] nsbtx) {
byte[] wholeMDL0 = GetFirstBlock(nsbmd);
byte[] wholeTEX0 = GetFirstBlock(nsbtx);
MemoryStream ms = new MemoryStream();
using (BinaryWriter msWriter = new BinaryWriter(ms)) {
msWriter.Write(NSBMD.NDS_TYPE_BMD0);
msWriter.Write(NSBMD.NDS_TYPE_BYTEORDER);
msWriter.Write(NSBMD.NDS_TYPE_UNK2);
ushort nBlocks = 2;
uint modelLength = (uint)(wholeMDL0.Length + NSBMD.HEADERSIZE + 4 * nBlocks);
msWriter.Write((uint)(modelLength + wholeTEX0.Length));
msWriter.Write(NSBMD.HEADERSIZE); //Header size, always 16
msWriter.Write(nBlocks); //Number of blocks, now it's 2 because we are inserting textures
msWriter.Write((uint)(msWriter.BaseStream.Position + 4 * nBlocks)); //Absolute offset to model data. We are gonna have to write two offsets
msWriter.Write(modelLength); //Copy offset to TEX0
msWriter.Write(wholeMDL0);
msWriter.Write(wholeTEX0);
}
return ms.ToArray();
}
public static byte[] BuildNSBTXHeader(uint texturesSize) {
MemoryStream ms = new MemoryStream();
using (BinaryWriter bw = new BinaryWriter(ms)) {
bw.Write(Encoding.UTF8.GetBytes("BTX0")); // Write magic code BTX0
bw.Write((ushort)0xFEFF); // Byte order
bw.Write((ushort)0x0001); // ???
bw.Write(texturesSize); // Write size of textures block
bw.Write((short)0x10); //Header size
bw.Write((short)0x01); //Number of sub-files???
bw.Write((uint)0x14); // Offset to sub-file
}
return ms.ToArray();
}
public static int CheckNSBMDHeader(byte[] modelFile) {
using (BinaryReader byteArrReader = new BinaryReader(new MemoryStream(modelFile))) {
if (byteArrReader.ReadUInt32() != NSBMD.NDS_TYPE_BMD0) {
MessageBox.Show("Please select an NSBMD file.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
return -1;
}
byteArrReader.BaseStream.Position = 0xE;
return byteArrReader.ReadInt16() >= 2 ? NSBMD_HAS_TEXTURE : NSBMD_DOESNTHAVE_TEXTURE;
}
}
public static byte[] GetModelWithoutTextures(byte[] modelFile) {
byte[] nsbmdHeaderData;
uint mdl0Size;
byte[] mdl0Data;
using (BinaryReader modelReader = new BinaryReader(new MemoryStream(modelFile))) {
modelReader.BaseStream.Position = 0x0;
nsbmdHeaderData = modelReader.ReadBytes(0x8);
modelReader.BaseStream.Position = 0x1C;
mdl0Size = modelReader.ReadUInt32(); // Read mdl0 file size
modelReader.BaseStream.Position = 0x18;
mdl0Data = modelReader.ReadBytes((int)mdl0Size);
}
MemoryStream output = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(output)) {
writer.Write(nsbmdHeaderData); // Write first header bytes, same for all NSBMD.
writer.Write(mdl0Size + 0x14);
writer.Write((short)0x10); // Writes BMD0 header size (always 16)
writer.Write((short)0x1); // Write new number of sub-files, since embedded textures are removed
writer.Write((uint)0x14); // Writes new start offset of MDL0
writer.Write(mdl0Data); // Writes MDL0;
}
return output.ToArray();
}
public static byte[] GetTexturesFromTexturedNSBMD(byte[] modelFile) {
using (BinaryReader byteArrReader = new BinaryReader(new MemoryStream(modelFile))) {
byteArrReader.BaseStream.Position = 14;
if (byteArrReader.ReadUInt16() < 2) //No textures
return new byte[0];
byteArrReader.BaseStream.Position = 20;
int texAbsoluteOffset = byteArrReader.ReadInt32();
byteArrReader.BaseStream.Position = texAbsoluteOffset + 4;
uint textureSize = byteArrReader.ReadUInt32();
byte[] nsbtxHeader = NSBUtils.BuildNSBTXHeader(20 + textureSize);
byte[] texData = DSUtils.ReadFromByteArray(modelFile, readFrom: texAbsoluteOffset);
byte[] output = new byte[nsbtxHeader.Length + texData.Length];
Buffer.BlockCopy(nsbtxHeader, 0, output, 0, nsbtxHeader.Length);
Buffer.BlockCopy(texData, 0, output, nsbtxHeader.Length, texData.Length);
return output;
}
}
private static byte[] GetFirstBlock(byte[] NSBFile) {
int blockSize;
uint offsetToMainBlock;
using (BinaryReader reader = new BinaryReader(new MemoryStream(NSBFile))) {
reader.BaseStream.Position = 16;
offsetToMainBlock = reader.ReadUInt32();
reader.BaseStream.Position = offsetToMainBlock + 4;
blockSize = reader.ReadInt32();
}
byte[] blockData = new byte[blockSize];
Buffer.BlockCopy(NSBFile, (int)offsetToMainBlock, blockData, 0, blockSize);
return blockData;
}
}
}
================================================
FILE: DS_Map/DSUtils/OverlayUtils.cs
================================================
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using static DSPRE.DSUtils;
using static DSPRE.RomInfo;
namespace DSPRE {
public static class OverlayUtils {
public static class OverlayTable {
private const int ENTRY_LEN = 32;
/**
* Only checks if the overlay is CONFIGURED as compressed
**/
public static bool IsDefaultCompressed(int ovNumber) {
using (DSUtils.EasyReader f = new EasyReader(RomInfo.overlayTablePath, ovNumber * ENTRY_LEN + 31)) {
return (f.ReadByte() & 1) == 1;
}
}
public static void SetDefaultCompressed(int ovNumber, bool compressStatus) {
DSUtils.WriteToFile(RomInfo.overlayTablePath, new byte[] { compressStatus ? (byte)1 : (byte)0 }, (uint)(ovNumber * ENTRY_LEN + 31)); //overlayNumber * size of entry + offset
}
public static uint GetRAMAddress(int ovNumber) {
using (DSUtils.EasyReader f = new EasyReader(RomInfo.overlayTablePath, ovNumber * ENTRY_LEN + 4)) {
return f.ReadUInt32();
}
}
public static uint GetUncompressedSize(int ovNumber) {
using (DSUtils.EasyReader f = new EasyReader(RomInfo.overlayTablePath, ovNumber * ENTRY_LEN + 8)) {
return f.ReadUInt32();
}
}
/**
* Gets number of overlays
**/
public static int GetNumberOfOverlays() {
using (FileStream fileStream = File.OpenRead(RomInfo.overlayTablePath))
{
// Get the length of the file in bytes
return (int)(fileStream.Length / ENTRY_LEN);
}
}
}
public static string GetPath(int overlayNumber) {
return $"{workDir}overlay\\overlay_{overlayNumber:D4}.bin";
}
/**
* Checks the actual size of the overlay file
**/
public static bool IsCompressed(int ovNumber) {
return (new FileInfo(GetPath(ovNumber)).Length < OverlayTable.GetUncompressedSize(ovNumber));
}
public static void RestoreFromCompressedBackup(int overlayNumber, bool eventEditorIsReady) {
String overlayFilePath = GetPath(overlayNumber);
if (File.Exists(overlayFilePath + DSUtils.backupSuffix)) {
if (new FileInfo(overlayFilePath).Length <= new FileInfo(overlayFilePath + DSUtils.backupSuffix).Length) { //if overlay is bigger than its backup
Console.WriteLine($"Overlay {overlayNumber} is already compressed.");
return;
} else {
File.Delete(overlayFilePath);
File.Move(overlayFilePath + DSUtils.backupSuffix, overlayFilePath);
}
} else {
string msg = $"Overlay File {overlayFilePath}{DSUtils.backupSuffix} couldn't be found and restored.";
Console.WriteLine(msg);
if (eventEditorIsReady) {
MessageBox.Show(msg, "Can't restore overlay from backup", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public static int Compress(int overlayNumber) {
string overlayFilePath = GetPath(overlayNumber);
if (!File.Exists(overlayFilePath)) {
MessageBox.Show("Overlay to decompress #" + overlayNumber + " doesn't exist",
"Overlay not found", MessageBoxButtons.OK, MessageBoxIcon.Error);
return ERR_OVERLAY_NOTFOUND;
}
Process compress = new Process();
compress.StartInfo.FileName = @"Tools\blz.exe";
compress.StartInfo.Arguments = "-en " + '"' + overlayFilePath + '"';
Application.DoEvents();
compress.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
compress.StartInfo.CreateNoWindow = true;
compress.Start();
compress.WaitForExit();
return compress.ExitCode;
}
public static int Decompress(string overlayFilePath, bool makeBackup = true) {
if (!File.Exists(overlayFilePath)) {
MessageBox.Show($"File to decompress \"{overlayFilePath}\" doesn't exist",
"Overlay not found", MessageBoxButtons.OK, MessageBoxIcon.Error);
return ERR_OVERLAY_NOTFOUND;
}
if (makeBackup) {
if (File.Exists(overlayFilePath + backupSuffix)) {
File.Delete(overlayFilePath + backupSuffix);
}
File.Copy(overlayFilePath, overlayFilePath + backupSuffix);
}
Process decompress = DSUtils.CreateDecompressProcess(overlayFilePath);
decompress.Start();
decompress.WaitForExit();
return decompress.ExitCode;
}
public static int Decompress(int overlayNumber, bool makeBackup = true) {
return Decompress(GetPath(overlayNumber), makeBackup);
}
}
}
================================================
FILE: DS_Map/DVCalculator/DVCalc.Designer.cs
================================================
using System.Windows.Forms;
namespace DSPRE
{
partial class DVCalc
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
#endregion
private Label poke_label;
private Label trainerClassIdx_label;
private Label trainerIdx_label;
private Label pokeLVL_label;
private NumericUpDown pokeLevel;
private NumericUpDown trainerClassIdx;
private NumericUpDown trainerIdx;
private ComboBox natureSelect;
private Label nature_label;
private Label DV_label;
private Button calcButton;
private CheckBox maleCheck;
private Label maxDVNature_label;
private Label IV_label;
private ComboBox pokemonSelector;
private Button showAllButton;
private Button helpButton;
}
}
================================================
FILE: DS_Map/DVCalculator/DVCalc.cs
================================================
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml.Linq;
namespace DSPRE
{
public partial class DVCalc : Form
{
public DVCalc(int TrainerIndex, int TrainerClassIndex)
{
InitializeComponent();
PopulateComboBox();
SetTrainerData(TrainerIndex, TrainerClassIndex);
//make Pokemon searchable
pokemonSelector.TextChanged += PokemonSelector_TextChanged;
pokemonSelector.AutoCompleteMode = AutoCompleteMode.Suggest;
pokemonSelector.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection autoCompleteSource = new AutoCompleteStringCollection();
foreach (KeyValuePair item in pokemonSelector.Items)
{
autoCompleteSource.Add(item.Value);
}
pokemonSelector.AutoCompleteCustomSource = autoCompleteSource;
}
private void MainForm_Load(object sender, EventArgs e)
{
}
private void InitializeComponent()
{
this.poke_label = new System.Windows.Forms.Label();
this.trainerClassIdx_label = new System.Windows.Forms.Label();
this.trainerIdx_label = new System.Windows.Forms.Label();
this.pokeLVL_label = new System.Windows.Forms.Label();
this.pokeLevel = new System.Windows.Forms.NumericUpDown();
this.trainerClassIdx = new System.Windows.Forms.NumericUpDown();
this.trainerIdx = new System.Windows.Forms.NumericUpDown();
this.natureSelect = new System.Windows.Forms.ComboBox();
this.nature_label = new System.Windows.Forms.Label();
this.DV_label = new System.Windows.Forms.Label();
this.calcButton = new System.Windows.Forms.Button();
this.maleCheck = new System.Windows.Forms.CheckBox();
this.maxDVNature_label = new System.Windows.Forms.Label();
this.IV_label = new System.Windows.Forms.Label();
this.pokemonSelector = new System.Windows.Forms.ComboBox();
this.showAllButton = new System.Windows.Forms.Button();
this.helpButton = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pokeLevel)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trainerClassIdx)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trainerIdx)).BeginInit();
this.SuspendLayout();
//
// poke_label
//
this.poke_label.AutoSize = true;
this.poke_label.Location = new System.Drawing.Point(28, 154);
this.poke_label.Name = "poke_label";
this.poke_label.Size = new System.Drawing.Size(65, 16);
this.poke_label.TabIndex = 3;
this.poke_label.Text = "Pokmon";
//
// trainerClassIdx_label
//
this.trainerClassIdx_label.AutoSize = true;
this.trainerClassIdx_label.Location = new System.Drawing.Point(28, 87);
this.trainerClassIdx_label.Name = "trainerClassIdx_label";
this.trainerClassIdx_label.Size = new System.Drawing.Size(122, 16);
this.trainerClassIdx_label.TabIndex = 4;
this.trainerClassIdx_label.Text = "Trainer Class Index";
//
// trainerIdx_label
//
this.trainerIdx_label.AutoSize = true;
this.trainerIdx_label.Location = new System.Drawing.Point(28, 21);
this.trainerIdx_label.Name = "trainerIdx_label";
this.trainerIdx_label.Size = new System.Drawing.Size(85, 16);
this.trainerIdx_label.TabIndex = 5;
this.trainerIdx_label.Text = "Trainer Index";
//
// pokeLVL_label
//
this.pokeLVL_label.AutoSize = true;
this.pokeLVL_label.Location = new System.Drawing.Point(278, 179);
this.pokeLVL_label.Name = "pokeLVL_label";
this.pokeLVL_label.Size = new System.Drawing.Size(33, 16);
this.pokeLVL_label.TabIndex = 6;
this.pokeLVL_label.Text = "LVL.";
//
// pokeLevel
//
this.pokeLevel.Location = new System.Drawing.Point(318, 177);
this.pokeLevel.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.pokeLevel.Name = "pokeLevel";
this.pokeLevel.Size = new System.Drawing.Size(46, 22);
this.pokeLevel.TabIndex = 7;
this.pokeLevel.Value = new decimal(new int[] {
50,
0,
0,
0});
//
// trainerClassIdx
//
this.trainerClassIdx.Location = new System.Drawing.Point(28, 110);
this.trainerClassIdx.Maximum = new decimal(new int[] {
120,
0,
0,
0});
this.trainerClassIdx.Name = "trainerClassIdx";
this.trainerClassIdx.Size = new System.Drawing.Size(125, 22);
this.trainerClassIdx.TabIndex = 9;
//
// trainerIdx
//
this.trainerIdx.Location = new System.Drawing.Point(28, 44);
this.trainerIdx.Maximum = new decimal(new int[] {
1000,
0,
0,
0});
this.trainerIdx.Name = "trainerIdx";
this.trainerIdx.Size = new System.Drawing.Size(125, 22);
this.trainerIdx.TabIndex = 10;
//
// natureSelect
//
this.natureSelect.FormattingEnabled = true;
this.natureSelect.Location = new System.Drawing.Point(192, 44);
this.natureSelect.Name = "natureSelect";
this.natureSelect.Size = new System.Drawing.Size(207, 24);
this.natureSelect.TabIndex = 11;
//
// nature_label
//
this.nature_label.AutoSize = true;
this.nature_label.Location = new System.Drawing.Point(192, 21);
this.nature_label.Name = "nature_label";
this.nature_label.Size = new System.Drawing.Size(47, 16);
this.nature_label.TabIndex = 12;
this.nature_label.Text = "Nature";
//
// DV_label
//
this.DV_label.AutoSize = true;
this.DV_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.DV_label.Location = new System.Drawing.Point(443, 44);
this.DV_label.Name = "DV_label";
this.DV_label.Size = new System.Drawing.Size(162, 25);
this.DV_label.TabIndex = 13;
this.DV_label.Text = "Difficulty Value: 0";
//
// calcButton
//
this.calcButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.calcButton.Location = new System.Drawing.Point(491, 179);
this.calcButton.Name = "calcButton";
this.calcButton.Size = new System.Drawing.Size(114, 51);
this.calcButton.TabIndex = 14;
this.calcButton.Text = "Calculate";
this.calcButton.UseVisualStyleBackColor = true;
this.calcButton.Click += new System.EventHandler(this.CalcButton_Click);
//
// maleCheck
//
this.maleCheck.AutoSize = true;
this.maleCheck.Checked = true;
this.maleCheck.CheckState = System.Windows.Forms.CheckState.Checked;
this.maleCheck.Location = new System.Drawing.Point(192, 111);
this.maleCheck.Name = "maleCheck";
this.maleCheck.Size = new System.Drawing.Size(112, 20);
this.maleCheck.TabIndex = 15;
this.maleCheck.Text = "Trainer Male?";
this.maleCheck.UseVisualStyleBackColor = true;
//
// maxDVNature_label
//
this.maxDVNature_label.AutoSize = true;
this.maxDVNature_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.maxDVNature_label.Location = new System.Drawing.Point(323, 127);
this.maxDVNature_label.Name = "maxDVNature_label";
this.maxDVNature_label.Size = new System.Drawing.Size(125, 20);
this.maxDVNature_label.TabIndex = 16;
this.maxDVNature_label.Text = "DV 255 Nature:";
//
// IV_label
//
this.IV_label.AutoSize = true;
this.IV_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.IV_label.Location = new System.Drawing.Point(323, 87);
this.IV_label.Name = "IV_label";
this.IV_label.Size = new System.Drawing.Size(113, 20);
this.IV_label.TabIndex = 17;
this.IV_label.Text = "Resulting IVs:";
//
// pokemonSelector
//
this.pokemonSelector.FormattingEnabled = true;
this.pokemonSelector.Location = new System.Drawing.Point(28, 176);
this.pokemonSelector.Name = "pokemonSelector";
this.pokemonSelector.Size = new System.Drawing.Size(244, 24);
this.pokemonSelector.TabIndex = 18;
//
// showAllButton
//
this.showAllButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.showAllButton.Location = new System.Drawing.Point(391, 192);
this.showAllButton.Name = "showAllButton";
this.showAllButton.Size = new System.Drawing.Size(94, 29);
this.showAllButton.TabIndex = 19;
this.showAllButton.Text = "Show All";
this.showAllButton.UseVisualStyleBackColor = true;
this.showAllButton.Click += new System.EventHandler(this.ShowAllButton_Click);
//
// helpButton
//
this.helpButton.Location = new System.Drawing.Point(541, 2);
this.helpButton.Name = "helpButton";
this.helpButton.Size = new System.Drawing.Size(75, 23);
this.helpButton.TabIndex = 20;
this.helpButton.Text = "Help";
this.helpButton.UseVisualStyleBackColor = true;
this.helpButton.Click += new System.EventHandler(this.buttonHelp_Click);
//
// DVCalc
//
this.ClientSize = new System.Drawing.Size(628, 242);
this.Controls.Add(this.helpButton);
this.Controls.Add(this.showAllButton);
this.Controls.Add(this.pokemonSelector);
this.Controls.Add(this.IV_label);
this.Controls.Add(this.maxDVNature_label);
this.Controls.Add(this.maleCheck);
this.Controls.Add(this.calcButton);
this.Controls.Add(this.DV_label);
this.Controls.Add(this.nature_label);
this.Controls.Add(this.natureSelect);
this.Controls.Add(this.trainerIdx);
this.Controls.Add(this.trainerClassIdx);
this.Controls.Add(this.pokeLevel);
this.Controls.Add(this.pokeLVL_label);
this.Controls.Add(this.trainerIdx_label);
this.Controls.Add(this.trainerClassIdx_label);
this.Controls.Add(this.poke_label);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Name = "DVCalc";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "DVCalc";
((System.ComponentModel.ISupportInitialize)(this.pokeLevel)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.trainerClassIdx)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.trainerIdx)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
private void PopulateComboBox()
{
// Populate Nature ComboBox (static readonly List)
natureSelect.DataSource = DVCalculator.Natures;
// Fill the pokemon selector combo box with pokemon names from the ROM
string[] pokeNames = RomInfo.GetPokemonNames();
pokemonSelector.Items.Clear();
for (int id = 0; id < pokeNames.Length; id++)
{
pokemonSelector.Items.Add(new KeyValuePair(id, pokeNames[id]));
}
pokemonSelector.SelectedIndex = 0;
}
private void SetTrainerData(int TrainerIndex, int TrainerClassIndex)
{
trainerIdx.Value = TrainerIndex;
trainerClassIdx.Value = TrainerClassIndex;
}
private void CalcButton_Click(object sender, EventArgs e)
{
// Natures are sorted by their index so this works
uint nature = (uint)natureSelect.SelectedIndex;
int pokemonIndex = 1;
if (pokemonSelector.SelectedItem != null)
{
KeyValuePair selectedPokemon = (KeyValuePair)pokemonSelector.SelectedItem;
pokemonIndex = (int)selectedPokemon.Key;
}
int DV = DVCalculator.findHighestDV((int)trainerIdx.Value, (int)trainerClassIdx.Value, maleCheck.Checked, pokemonIndex, (int)pokeLevel.Value, nature);
// Determine nature for max DV (max IV) for convenience
uint maxDVNature = DVCalculator.getNatureFromPID(DVCalculator.generatePID((int)trainerIdx.Value, (int)trainerClassIdx.Value, maleCheck.Checked, pokemonIndex, (int)pokeLevel.Value, 255));
// Display results
DV_label.Text = "Difficulty Value: " + DV;
IV_label.Text = "Resulting IVs: " + (DV * 31 / 255);
maxDVNature_label.Text = "DV 255 Nature: " + DVCalculator.Natures[(int)maxDVNature];
}
private void ShowAllButton_Click(object sender, EventArgs e)
{
int pokemonIndex = 1;
if (pokemonSelector.SelectedItem != null)
{
KeyValuePair selectedPokemon = (KeyValuePair)pokemonSelector.SelectedItem;
pokemonIndex = (int)selectedPokemon.Key;
}
// Create a list of DV-IV-Nature Triplets
List natureDict = DVCalculator.getAllNatures((int)trainerIdx.Value, (int)trainerClassIdx.Value, maleCheck.Checked, pokemonIndex, (int)pokeLevel.Value);
// Create an instance of the view form and pass the data
// There might be a better way to do this?
DVCalcNatureViewerForm natureViewer = new DVCalcNatureViewerForm(natureDict);
natureViewer.ShowDialog();
}
private void PokemonSelector_TextChanged(object sender, EventArgs e)
{
if (sender == null || !(sender is ComboBox)){ { return; } }
ComboBox comboBox = (ComboBox)sender;
string enteredText = comboBox.Text.ToLower();
// If name of pokemon is typed select that item
foreach (KeyValuePair item in comboBox.Items)
{
if (item.Value.ToLower().Equals(enteredText))
{
comboBox.SelectedItem = item;
return;
}
}
}
private void buttonHelp_Click(object sender, EventArgs e)
{
MessageBox.Show("DV, or \"Difficulty Value\", is used by the game engine to calculate how tough an opponent Pokemon should be.\n" +
"The DV affects a Pokemon's Nature and IVs - the higher the value, the stronger the Pokemon.\n" +
"DVs will go from 0 (0 IVs) to 255 (31 IVs). Natures are chosen semi-randomly." +
"\nIVs will be the same value for all Stats at any DV, so Hidden Power will only be Fighting or Dark Type." +
"\nThis calculator allows you to choose a desired Nature and then find the highest possible DV that will yield that Nature." +
"\nIf you want a specific combination of IVs and Nature instead, please click the \"Show All\" button and find the one you want."
, "Difficulty Value", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
================================================
FILE: DS_Map/DVCalculator/DVCalc.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/DVCalculator/DVCalcNatureViewerForm.Designer.cs
================================================
using System.Drawing;
using System.Windows.Forms;
namespace DSPRE
{
partial class DVCalcNatureViewerForm
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.natureGridView = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.natureGridView)).BeginInit();
this.SuspendLayout();
//
// natureGridView
//
this.natureGridView.AllowUserToAddRows = false;
this.natureGridView.AllowUserToDeleteRows = false;
this.natureGridView.AllowUserToOrderColumns = true;
this.natureGridView.AllowUserToResizeRows = false;
this.natureGridView.BackgroundColor = System.Drawing.SystemColors.Menu;
this.natureGridView.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.natureGridView.ColumnHeadersHeight = 29;
this.natureGridView.Location = new System.Drawing.Point(16, 10);
this.natureGridView.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.natureGridView.Name = "natureGridView";
this.natureGridView.ReadOnly = true;
this.natureGridView.RowHeadersWidth = 51;
this.natureGridView.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.natureGridView.Size = new System.Drawing.Size(387, 333);
this.natureGridView.TabIndex = 0;
//
// DVCalcNatureViewerForm
//
this.AllowDrop = true;
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(415, 352);
this.Controls.Add(this.natureGridView);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.MaximizeBox = false;
this.Name = "DVCalcNatureViewerForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Full List";
((System.ComponentModel.ISupportInitialize)(this.natureGridView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private DataGridView natureGridView;
}
}
================================================
FILE: DS_Map/DVCalculator/DVCalcNatureViewerForm.cs
================================================
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;
namespace DSPRE
{
public partial class DVCalcNatureViewerForm : Form
{
private List data;
public DVCalcNatureViewerForm(List data)
{
InitializeComponent();
this.data = data;
PopulateDataGridView();
}
private void PopulateDataGridView()
{
// Create a BindingList to bind to the DataGridView
var bindingList = new BindingList(data.ToList());
// Set the DataSource of the DataGridView
natureGridView.DataSource = bindingList;
// Set the columns
natureGridView.Columns[0].HeaderText = "IV";
natureGridView.Columns[0].DataPropertyName = "IV";
natureGridView.Columns[1].HeaderText = "Nature";
natureGridView.Columns[1].DataPropertyName = "Nature";
natureGridView.Columns[2].HeaderText = "DV";
natureGridView.Columns[2].DataPropertyName = "DV";
// Adjust column widths
natureGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}
}
}
================================================
FILE: DS_Map/DVCalculator/DVCalcNatureViewerForm.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/DVCalculator/DVCalculator.cs
================================================
using System.Collections.Generic;
namespace DSPRE
{
// Putting this class here is bad practice, however it's just a really small utility class
public class DVIVNatureTriplet
{
public int DV { get; set; }
public int IV { get; set; }
public string Nature { get; set; }
public DVIVNatureTriplet(int DV, int IV, string Nature)
{
this.DV = DV;
this.IV = IV;
this.Nature = Nature;
}
}
internal static class DVCalculator
{
private static long seed;
public static void setSeed(long seed)
{
DVCalculator.seed = seed;
}
public static long getSeed()
{
return DVCalculator.seed;
}
// This function is lifted from turtleisaac's Pokeditor (with permission)
// See https://github.com/turtleisaac/PokEditor-v2/blob/72ca6ab641f616b8be9a87624b81896baa45f947/src/com/turtleisaac/pokeditor/utilities/TrainerPersonalityCalculator.java
public static long getNextRandom()
{
long random = 0x41c64e6d * seed + 0x6073;
//last 32 bits is new seed
seed = random & 0xFFFFFFFFL;
return random;
}
public static int findHighestDV(int trainerIdx, int trainerClassIdx, bool trainerClassMale, int pokeIdx, int pokeLevel, uint nature)
{
int DV;
// Iterate over all possible PIDs and return highest DV that yields the desired nature
for (DV = 255; DV >= 0; DV--)
{
if (getNatureFromPID(generatePID(trainerIdx, trainerClassIdx, trainerClassMale, pokeIdx, pokeLevel, DV)) == nature)
{ return DV; }
}
return -1;
}
// this function is lifted from turtleisaac's Pokeditor (with permission)
// See https://github.com/turtleisaac/PokEditor-v2/blob/72ca6ab641f616b8be9a87624b81896baa45f947/src/com/turtleisaac/pokeditor/utilities/TrainerPersonalityCalculator.java
public static uint generatePID(int trainerIdx, int trainerClassIdx, bool trainerClassMale, int pokeIdx, int pokeLevel, int difficultyValue)
{
long newSeed = trainerIdx + pokeIdx + pokeLevel + difficultyValue;
long random = 0;
setSeed(newSeed);
while (trainerClassIdx > 0)
{
trainerClassIdx--;
random = getNextRandom();
}
// Don't really get this part? Why are we shifting to the right then left again?
long PID = (random >> 16) & 0xffff;
PID = PID * 256;
// This seems super arbitrary (wtf GameFreak?)
PID += trainerClassMale ? 136 : 120;
return (uint)PID;
}
public static uint getNatureFromPID(uint PID)
{
return (PID % 100) % 25;
}
public static List getAllNatures(int trainerIdx, int trainerClassIdx, bool trainerClassMale, int pokeIdx, int pokeLevel)
{
List natureList = new List();
int DV;
uint natureIdx;
// Iterate over all possible PIDs and store the DV IV and Nature String in the custom data type
for (DV = 255; DV >= 0; DV--)
{
natureIdx = getNatureFromPID(generatePID(trainerIdx, trainerClassIdx, trainerClassMale, pokeIdx, pokeLevel, DV));
natureList.Add(new DVIVNatureTriplet(DV, DV*31/255 , Natures[(int)natureIdx]));
}
return natureList;
}
public static readonly List Natures = new List
{
"Hardy: Neutral",
"Lonely: +Atk, -Def",
"Brave: +Atk, -Spe",
"Adamant: +Atk, -SpA",
"Naughty: +Atk, -SpD",
"Bold: +Def, -Atk",
"Docile: Neutral",
"Relaxed: +Def, -Spe",
"Impish: +Def, -SpA",
"Lax: +Def, -SpD",
"Timid: +Spe, -Atk",
"Hasty: +Spe, -Def",
"Serious: Neutral",
"Jolly: +Spe, -SpA",
"Naive: +Spe, -SpD",
"Modest: +SpA, -Atk",
"Mild: +SpA, -Def",
"Quiet: +SpA, -Spe",
"Bashful: Neutral",
"Rash: +SpA, -SpD",
"Calm: +SpD, -Atk",
"Gentle: +SpD, -Def",
"Sassy: +SpD, -Spe",
"Careful: +SpD, -SpA",
"Quirky: Neutral"
};
}
}
================================================
FILE: DS_Map/EditorPanels.cs
================================================
using System.Windows.Forms;
using DSPRE.Editors;
namespace DSPRE {
public static class EditorPanels {
public static MainProgram MainProgram;
public static void Initialize(MainProgram mainProgram) {
MainProgram = mainProgram;
}
public static TabControl mainTabControl { get { return MainProgram.mainTabControl; } }
public static ScriptEditor scriptEditor { get { return MainProgram.scriptEditor; } }
public static LevelScriptEditor levelScriptEditor { get { return MainProgram.levelScriptEditor; } }
public static EncountersEditor encountersEditor { get { return MainProgram.encountersEditor; } }
public static TabPage scriptEditorTabPage { get { return MainProgram.tabPageScriptEditor; } }
public static TabPage levelScriptEditorTabPage { get { return MainProgram.tabPageLevelScriptEditor; } }
public static TabPage tabPageEncountersEditor { get { return MainProgram.tabPageEncountersEditor; } }
}
}
================================================
FILE: DS_Map/Editors/EncountersEditor.Designer.cs
================================================
namespace DSPRE.Editors
{
partial class EncountersEditor
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.tabControl = new System.Windows.Forms.TabControl();
this.tabPageHeadbuttEditor = new System.Windows.Forms.TabPage();
this.headbuttEncounterEditor = new DSPRE.Editors.HeadbuttEncounterEditor();
this.tabPageSafariZoneEditor = new System.Windows.Forms.TabPage();
this.safariZoneEditor = new DSPRE.Editors.SafariZoneEditor();
this.tabControl.SuspendLayout();
this.tabPageHeadbuttEditor.SuspendLayout();
this.tabPageSafariZoneEditor.SuspendLayout();
this.SuspendLayout();
//
// tabControl
//
this.tabControl.Controls.Add(this.tabPageHeadbuttEditor);
this.tabControl.Controls.Add(this.tabPageSafariZoneEditor);
this.tabControl.Location = new System.Drawing.Point(4, 4);
this.tabControl.Name = "tabControl";
this.tabControl.SelectedIndex = 0;
this.tabControl.Size = new System.Drawing.Size(1103, 654);
this.tabControl.TabIndex = 2;
//
// tabPageHeadbuttEditor
//
this.tabPageHeadbuttEditor.Controls.Add(this.headbuttEncounterEditor);
this.tabPageHeadbuttEditor.Location = new System.Drawing.Point(4, 22);
this.tabPageHeadbuttEditor.Name = "tabPageHeadbuttEditor";
this.tabPageHeadbuttEditor.Padding = new System.Windows.Forms.Padding(3);
this.tabPageHeadbuttEditor.Size = new System.Drawing.Size(1095, 628);
this.tabPageHeadbuttEditor.TabIndex = 0;
this.tabPageHeadbuttEditor.Text = "Headbutt";
this.tabPageHeadbuttEditor.UseVisualStyleBackColor = true;
this.tabPageHeadbuttEditor.Enter += new System.EventHandler(this.tabPageHeadbuttEditor_Enter);
//
// headbuttEncounterEditor
//
this.headbuttEncounterEditor.BackColor = System.Drawing.SystemColors.Control;
this.headbuttEncounterEditor.headbuttEncounterEditorIsReady = false;
this.headbuttEncounterEditor.Location = new System.Drawing.Point(6, 6);
this.headbuttEncounterEditor.Name = "headbuttEncounterEditor";
this.headbuttEncounterEditor.Size = new System.Drawing.Size(1081, 621);
this.headbuttEncounterEditor.TabIndex = 1;
//
// tabPageSafariZoneEditor
//
this.tabPageSafariZoneEditor.Controls.Add(this.safariZoneEditor);
this.tabPageSafariZoneEditor.Location = new System.Drawing.Point(4, 22);
this.tabPageSafariZoneEditor.Name = "tabPageSafariZoneEditor";
this.tabPageSafariZoneEditor.Padding = new System.Windows.Forms.Padding(3);
this.tabPageSafariZoneEditor.Size = new System.Drawing.Size(1095, 628);
this.tabPageSafariZoneEditor.TabIndex = 1;
this.tabPageSafariZoneEditor.Text = "Safari Zone";
this.tabPageSafariZoneEditor.UseVisualStyleBackColor = true;
this.tabPageSafariZoneEditor.Enter += new System.EventHandler(this.tabPageSafariZoneEditor_Enter);
//
// safariZoneEditor
//
this.safariZoneEditor.Location = new System.Drawing.Point(6, 6);
this.safariZoneEditor.Name = "safariZoneEditor";
this.safariZoneEditor.safariZoneEditorIsReady = false;
this.safariZoneEditor.Size = new System.Drawing.Size(996, 341);
this.safariZoneEditor.TabIndex = 1;
//
// EncountersEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.tabControl);
this.Name = "EncountersEditor";
this.Size = new System.Drawing.Size(1111, 664);
this.tabControl.ResumeLayout(false);
this.tabPageHeadbuttEditor.ResumeLayout(false);
this.tabPageSafariZoneEditor.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public HeadbuttEncounterEditor headbuttEncounterEditor;
private System.Windows.Forms.TabControl tabControl;
private System.Windows.Forms.TabPage tabPageHeadbuttEditor;
private System.Windows.Forms.TabPage tabPageSafariZoneEditor;
public SafariZoneEditor safariZoneEditor;
}
}
================================================
FILE: DS_Map/Editors/EncountersEditor.cs
================================================
using System.Windows.Forms;
namespace DSPRE.Editors
{
public partial class EncountersEditor : UserControl
{
public EncountersEditor()
{
InitializeComponent();
}
public void SetupEncountersEditor() {
tabPageHeadbuttEditor_Enter(null, null);
}
private void tabPageHeadbuttEditor_Enter(object sender, System.EventArgs e)
{
headbuttEncounterEditor.SetupHeadbuttEncounterEditor();
headbuttEncounterEditor.makeCurrent();
}
private void tabPageSafariZoneEditor_Enter(object sender, System.EventArgs e)
{
safariZoneEditor.SetupSafariZoneEditor();
}
}
}
================================================
FILE: DS_Map/Editors/EncountersEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/Editors/HeadbuttEncounterEditor.Designer.cs
================================================
using System.ComponentModel;
namespace DSPRE.Editors {
partial class HeadbuttEncounterEditor {
///
/// Required designer variable.
///
private IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
this.buttonSaveAs = new System.Windows.Forms.Button();
this.buttonSave = new System.Windows.Forms.Button();
this.tabControl = new System.Windows.Forms.TabControl();
this.tabPageNormal = new System.Windows.Forms.TabPage();
this.headbuttEncounterEditorTabNormal = new DSPRE.Editors.HeadbuttEncounterEditorTab();
this.tabPageSpecial = new System.Windows.Forms.TabPage();
this.headbuttEncounterEditorTabSpecial = new DSPRE.Editors.HeadbuttEncounterEditorTab();
this.mapRenderPanel = new System.Windows.Forms.Panel();
this.openGlPictureBox = new System.Windows.Forms.PictureBox();
this.mapScreenshotButton = new System.Windows.Forms.Button();
this.headbuttFileComboBox = new System.Windows.Forms.ComboBox();
this.comboBoxMapFile = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.labelLocationName = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.numericUpDownTreeGlobalX = new System.Windows.Forms.NumericUpDown();
this.numericUpDownTreeGlobalY = new System.Windows.Forms.NumericUpDown();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.numericUpDownTreeMatrixX = new System.Windows.Forms.NumericUpDown();
this.numericUpDownTreeMatrixY = new System.Windows.Forms.NumericUpDown();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.numericUpDownTreeMapX = new System.Windows.Forms.NumericUpDown();
this.numericUpDownTreeMapY = new System.Windows.Forms.NumericUpDown();
this.RightClickLabel = new System.Windows.Forms.Label();
this.LeftClickLabel = new System.Windows.Forms.Label();
this.LeftClickPicture = new System.Windows.Forms.PictureBox();
this.rightClickPicture = new System.Windows.Forms.PictureBox();
this.buttonImport = new System.Windows.Forms.Button();
this.tabControl.SuspendLayout();
this.tabPageNormal.SuspendLayout();
this.tabPageSpecial.SuspendLayout();
this.mapRenderPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.openGlPictureBox)).BeginInit();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeGlobalX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeGlobalY)).BeginInit();
this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMatrixX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMatrixY)).BeginInit();
this.groupBox3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMapX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMapY)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.LeftClickPicture)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.rightClickPicture)).BeginInit();
this.SuspendLayout();
//
// buttonSaveAs
//
this.buttonSaveAs.Image = global::DSPRE.Properties.Resources.exportArrow;
this.buttonSaveAs.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonSaveAs.Location = new System.Drawing.Point(278, 3);
this.buttonSaveAs.Name = "buttonSaveAs";
this.buttonSaveAs.Size = new System.Drawing.Size(71, 23);
this.buttonSaveAs.TabIndex = 9;
this.buttonSaveAs.Text = "Export";
this.buttonSaveAs.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonSaveAs.UseVisualStyleBackColor = true;
this.buttonSaveAs.Click += new System.EventHandler(this.buttonSaveAs_Click);
//
// buttonSave
//
this.buttonSave.Image = global::DSPRE.Properties.Resources.saveButton;
this.buttonSave.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonSave.Location = new System.Drawing.Point(215, 3);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(62, 23);
this.buttonSave.TabIndex = 10;
this.buttonSave.Text = "Save";
this.buttonSave.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
//
// tabControl
//
this.tabControl.Controls.Add(this.tabPageNormal);
this.tabControl.Controls.Add(this.tabPageSpecial);
this.tabControl.Location = new System.Drawing.Point(3, 71);
this.tabControl.Name = "tabControl";
this.tabControl.SelectedIndex = 0;
this.tabControl.Size = new System.Drawing.Size(274, 544);
this.tabControl.TabIndex = 21;
//
// tabPageNormal
//
this.tabPageNormal.Controls.Add(this.headbuttEncounterEditorTabNormal);
this.tabPageNormal.Location = new System.Drawing.Point(4, 22);
this.tabPageNormal.Name = "tabPageNormal";
this.tabPageNormal.Padding = new System.Windows.Forms.Padding(3);
this.tabPageNormal.Size = new System.Drawing.Size(266, 518);
this.tabPageNormal.TabIndex = 0;
this.tabPageNormal.Text = "Normal";
this.tabPageNormal.UseVisualStyleBackColor = true;
//
// headbuttEncounterEditorTabNormal
//
this.headbuttEncounterEditorTabNormal.Location = new System.Drawing.Point(2, 2);
this.headbuttEncounterEditorTabNormal.Name = "headbuttEncounterEditorTabNormal";
this.headbuttEncounterEditorTabNormal.Size = new System.Drawing.Size(264, 519);
this.headbuttEncounterEditorTabNormal.TabIndex = 0;
//
// tabPageSpecial
//
this.tabPageSpecial.Controls.Add(this.headbuttEncounterEditorTabSpecial);
this.tabPageSpecial.Location = new System.Drawing.Point(4, 22);
this.tabPageSpecial.Name = "tabPageSpecial";
this.tabPageSpecial.Padding = new System.Windows.Forms.Padding(3);
this.tabPageSpecial.Size = new System.Drawing.Size(266, 518);
this.tabPageSpecial.TabIndex = 1;
this.tabPageSpecial.Text = "Special";
this.tabPageSpecial.UseVisualStyleBackColor = true;
//
// headbuttEncounterEditorTabSpecial
//
this.headbuttEncounterEditorTabSpecial.Location = new System.Drawing.Point(2, 2);
this.headbuttEncounterEditorTabSpecial.Name = "headbuttEncounterEditorTabSpecial";
this.headbuttEncounterEditorTabSpecial.Size = new System.Drawing.Size(402, 518);
this.headbuttEncounterEditorTabSpecial.TabIndex = 0;
//
// mapRenderPanel
//
this.mapRenderPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.mapRenderPanel.Controls.Add(this.openGlPictureBox);
this.mapRenderPanel.Location = new System.Drawing.Point(423, 4);
this.mapRenderPanel.Name = "mapRenderPanel";
this.mapRenderPanel.Size = new System.Drawing.Size(610, 610);
this.mapRenderPanel.TabIndex = 24;
//
// openGlPictureBox
//
this.openGlPictureBox.BackColor = System.Drawing.Color.White;
this.openGlPictureBox.Location = new System.Drawing.Point(0, 0);
this.openGlPictureBox.Name = "openGlPictureBox";
this.openGlPictureBox.Size = new System.Drawing.Size(608, 608);
this.openGlPictureBox.TabIndex = 3;
this.openGlPictureBox.TabStop = false;
this.openGlPictureBox.Click += new System.EventHandler(this.openGlPictureBox_Click);
//
// mapScreenshotButton
//
this.mapScreenshotButton.Image = global::DSPRE.Properties.Resources.cameraIcon;
this.mapScreenshotButton.Location = new System.Drawing.Point(1036, 574);
this.mapScreenshotButton.Name = "mapScreenshotButton";
this.mapScreenshotButton.Size = new System.Drawing.Size(41, 40);
this.mapScreenshotButton.TabIndex = 39;
this.mapScreenshotButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.mapScreenshotButton.UseVisualStyleBackColor = true;
this.mapScreenshotButton.Click += new System.EventHandler(this.mapScreenshotButton_Click);
//
// headbuttFileComboBox
//
this.headbuttFileComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.headbuttFileComboBox.FormattingEnabled = true;
this.headbuttFileComboBox.Location = new System.Drawing.Point(45, 4);
this.headbuttFileComboBox.Name = "headbuttFileComboBox";
this.headbuttFileComboBox.Size = new System.Drawing.Size(168, 21);
this.headbuttFileComboBox.TabIndex = 40;
this.headbuttFileComboBox.SelectedIndexChanged += new System.EventHandler(this.comboBoxMapHeader_SelectedIndexChanged);
//
// comboBoxMapFile
//
this.comboBoxMapFile.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxMapFile.FormattingEnabled = true;
this.comboBoxMapFile.Location = new System.Drawing.Point(45, 31);
this.comboBoxMapFile.Name = "comboBoxMapFile";
this.comboBoxMapFile.Size = new System.Drawing.Size(168, 21);
this.comboBoxMapFile.TabIndex = 40;
this.comboBoxMapFile.SelectedIndexChanged += new System.EventHandler(this.comboBoxMapFile_SelectedIndexChanged);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 7);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(42, 13);
this.label1.TabIndex = 41;
this.label1.Text = "Header";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(14, 35);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(28, 13);
this.label2.TabIndex = 41;
this.label2.Text = "Map";
//
// labelLocationName
//
this.labelLocationName.AutoSize = true;
this.labelLocationName.Location = new System.Drawing.Point(219, 35);
this.labelLocationName.Name = "labelLocationName";
this.labelLocationName.Size = new System.Drawing.Size(35, 13);
this.labelLocationName.TabIndex = 42;
this.labelLocationName.Text = "label3";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.numericUpDownTreeGlobalX);
this.groupBox1.Controls.Add(this.numericUpDownTreeGlobalY);
this.groupBox1.Location = new System.Drawing.Point(279, 452);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(134, 49);
this.groupBox1.TabIndex = 16;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Global";
//
// numericUpDownTreeGlobalX
//
this.numericUpDownTreeGlobalX.Location = new System.Drawing.Point(6, 19);
this.numericUpDownTreeGlobalX.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.numericUpDownTreeGlobalX.Name = "numericUpDownTreeGlobalX";
this.numericUpDownTreeGlobalX.Size = new System.Drawing.Size(58, 20);
this.numericUpDownTreeGlobalX.TabIndex = 15;
this.numericUpDownTreeGlobalX.ValueChanged += new System.EventHandler(this.numericUpDownTreeGlobalX_ValueChanged);
//
// numericUpDownTreeGlobalY
//
this.numericUpDownTreeGlobalY.Location = new System.Drawing.Point(70, 19);
this.numericUpDownTreeGlobalY.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.numericUpDownTreeGlobalY.Name = "numericUpDownTreeGlobalY";
this.numericUpDownTreeGlobalY.Size = new System.Drawing.Size(58, 20);
this.numericUpDownTreeGlobalY.TabIndex = 15;
this.numericUpDownTreeGlobalY.ValueChanged += new System.EventHandler(this.numericUpDownTreeGlobalY_ValueChanged);
//
// groupBox2
//
this.groupBox2.Controls.Add(this.numericUpDownTreeMatrixX);
this.groupBox2.Controls.Add(this.numericUpDownTreeMatrixY);
this.groupBox2.Location = new System.Drawing.Point(279, 507);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(134, 49);
this.groupBox2.TabIndex = 16;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Matrix";
//
// numericUpDownTreeMatrixX
//
this.numericUpDownTreeMatrixX.Location = new System.Drawing.Point(6, 19);
this.numericUpDownTreeMatrixX.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.numericUpDownTreeMatrixX.Name = "numericUpDownTreeMatrixX";
this.numericUpDownTreeMatrixX.Size = new System.Drawing.Size(58, 20);
this.numericUpDownTreeMatrixX.TabIndex = 15;
this.numericUpDownTreeMatrixX.ValueChanged += new System.EventHandler(this.numericUpDownTreeMatrixX_ValueChanged);
//
// numericUpDownTreeMatrixY
//
this.numericUpDownTreeMatrixY.Location = new System.Drawing.Point(70, 19);
this.numericUpDownTreeMatrixY.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.numericUpDownTreeMatrixY.Name = "numericUpDownTreeMatrixY";
this.numericUpDownTreeMatrixY.Size = new System.Drawing.Size(58, 20);
this.numericUpDownTreeMatrixY.TabIndex = 15;
this.numericUpDownTreeMatrixY.ValueChanged += new System.EventHandler(this.numericUpDownTreeMatrixY_ValueChanged);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.numericUpDownTreeMapX);
this.groupBox3.Controls.Add(this.numericUpDownTreeMapY);
this.groupBox3.Location = new System.Drawing.Point(279, 562);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(134, 49);
this.groupBox3.TabIndex = 16;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Local";
//
// numericUpDownTreeMapX
//
this.numericUpDownTreeMapX.Location = new System.Drawing.Point(6, 19);
this.numericUpDownTreeMapX.Maximum = new decimal(new int[] {
31,
0,
0,
0});
this.numericUpDownTreeMapX.Name = "numericUpDownTreeMapX";
this.numericUpDownTreeMapX.Size = new System.Drawing.Size(58, 20);
this.numericUpDownTreeMapX.TabIndex = 15;
this.numericUpDownTreeMapX.ValueChanged += new System.EventHandler(this.numericUpDownTreeMapX_ValueChanged);
//
// numericUpDownTreeMapY
//
this.numericUpDownTreeMapY.Location = new System.Drawing.Point(70, 19);
this.numericUpDownTreeMapY.Maximum = new decimal(new int[] {
31,
0,
0,
0});
this.numericUpDownTreeMapY.Name = "numericUpDownTreeMapY";
this.numericUpDownTreeMapY.Size = new System.Drawing.Size(58, 20);
this.numericUpDownTreeMapY.TabIndex = 15;
this.numericUpDownTreeMapY.ValueChanged += new System.EventHandler(this.numericUpDownTreeMapY_ValueChanged);
//
// RightClickLabel
//
this.RightClickLabel.AutoSize = true;
this.RightClickLabel.Location = new System.Drawing.Point(308, 425);
this.RightClickLabel.Name = "RightClickLabel";
this.RightClickLabel.Size = new System.Drawing.Size(37, 13);
this.RightClickLabel.TabIndex = 66;
this.RightClickLabel.Text = "Select";
//
// LeftClickLabel
//
this.LeftClickLabel.AutoSize = true;
this.LeftClickLabel.Location = new System.Drawing.Point(352, 425);
this.LeftClickLabel.Name = "LeftClickLabel";
this.LeftClickLabel.Size = new System.Drawing.Size(34, 13);
this.LeftClickLabel.TabIndex = 63;
this.LeftClickLabel.Text = "Move";
//
// LeftClickPicture
//
this.LeftClickPicture.Image = global::DSPRE.Properties.Resources.LeftClick;
this.LeftClickPicture.ImageLocation = "";
this.LeftClickPicture.Location = new System.Drawing.Point(349, 387);
this.LeftClickPicture.Name = "LeftClickPicture";
this.LeftClickPicture.Size = new System.Drawing.Size(38, 38);
this.LeftClickPicture.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.LeftClickPicture.TabIndex = 61;
this.LeftClickPicture.TabStop = false;
//
// rightClickPicture
//
this.rightClickPicture.Image = global::DSPRE.Properties.Resources.RightClick;
this.rightClickPicture.ImageLocation = "";
this.rightClickPicture.Location = new System.Drawing.Point(307, 387);
this.rightClickPicture.Name = "rightClickPicture";
this.rightClickPicture.Size = new System.Drawing.Size(38, 38);
this.rightClickPicture.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.rightClickPicture.TabIndex = 65;
this.rightClickPicture.TabStop = false;
//
// buttonImport
//
this.buttonImport.Image = global::DSPRE.Properties.Resources.importArrow;
this.buttonImport.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonImport.Location = new System.Drawing.Point(350, 3);
this.buttonImport.Name = "buttonImport";
this.buttonImport.Size = new System.Drawing.Size(71, 23);
this.buttonImport.TabIndex = 9;
this.buttonImport.Text = "Import";
this.buttonImport.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonImport.UseVisualStyleBackColor = true;
this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click);
//
// HeadbuttEncounterEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.Controls.Add(this.RightClickLabel);
this.Controls.Add(this.LeftClickLabel);
this.Controls.Add(this.LeftClickPicture);
this.Controls.Add(this.rightClickPicture);
this.Controls.Add(this.labelLocationName);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.comboBoxMapFile);
this.Controls.Add(this.headbuttFileComboBox);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.mapRenderPanel);
this.Controls.Add(this.tabControl);
this.Controls.Add(this.mapScreenshotButton);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.buttonImport);
this.Controls.Add(this.buttonSaveAs);
this.Controls.Add(this.buttonSave);
this.Controls.Add(this.groupBox1);
this.Location = new System.Drawing.Point(15, 15);
this.Name = "HeadbuttEncounterEditor";
this.Size = new System.Drawing.Size(1080, 620);
this.tabControl.ResumeLayout(false);
this.tabPageNormal.ResumeLayout(false);
this.tabPageSpecial.ResumeLayout(false);
this.mapRenderPanel.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.openGlPictureBox)).EndInit();
this.groupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeGlobalX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeGlobalY)).EndInit();
this.groupBox2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMatrixX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMatrixY)).EndInit();
this.groupBox3.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMapX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownTreeMapY)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.LeftClickPicture)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.rightClickPicture)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.Button buttonSaveAs;
private System.Windows.Forms.Button buttonSave;
#endregion
private System.Windows.Forms.TabControl tabControl;
private System.Windows.Forms.TabPage tabPageNormal;
private System.Windows.Forms.TabPage tabPageSpecial;
private HeadbuttEncounterEditorTab headbuttEncounterEditorTabNormal;
private HeadbuttEncounterEditorTab headbuttEncounterEditorTabSpecial;
private System.Windows.Forms.Panel mapRenderPanel;
private System.Windows.Forms.PictureBox openGlPictureBox;
private System.Windows.Forms.Button mapScreenshotButton;
private System.Windows.Forms.ComboBox headbuttFileComboBox;
private System.Windows.Forms.ComboBox comboBoxMapFile;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label labelLocationName;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.NumericUpDown numericUpDownTreeGlobalX;
private System.Windows.Forms.NumericUpDown numericUpDownTreeGlobalY;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.NumericUpDown numericUpDownTreeMatrixX;
private System.Windows.Forms.NumericUpDown numericUpDownTreeMatrixY;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.NumericUpDown numericUpDownTreeMapX;
private System.Windows.Forms.NumericUpDown numericUpDownTreeMapY;
private System.Windows.Forms.Label RightClickLabel;
private System.Windows.Forms.Label LeftClickLabel;
private System.Windows.Forms.PictureBox LeftClickPicture;
private System.Windows.Forms.PictureBox rightClickPicture;
private System.Windows.Forms.Button buttonImport;
}
}
================================================
FILE: DS_Map/Editors/HeadbuttEncounterEditor.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Windows.Forms;
using DSPRE.ROMFiles;
namespace DSPRE.Editors {
public partial class HeadbuttEncounterEditor : UserControl {
public bool headbuttEncounterEditorIsReady { get; set; } = false;
private ListBox2 listBoxTrees;
private HeadbuttTree headbuttTree;
private HeaderHGSS mapHeader;
private HeadbuttEncounterFile headbuttEncounterFile;
private HeadbuttEncounterMap headbuttEncounterMap;
private GameMatrix gameMatrix;
private AreaData areaData;
private MapFile mapFile;
private string locationName;
private int width;
private int height;
static SimpleOpenGlControl2 openGlControl;
private Pen selectedPen;
private Pen normalPen;
private SolidBrush normalBrush;
private Pen specialPen;
private SolidBrush specialBrush;
private static float perspective;
private static float ang;
private static float dist;
private static float elev;
public HeadbuttEncounterEditor() {
InitializeComponent();
}
//TODO: refresh headers list if a header is added
public void SetupHeadbuttEncounterEditor(bool force = false) {
if (headbuttEncounterEditorIsReady && !force) {
return;
}
headbuttEncounterEditorIsReady = true;
DSUtils.TryUnpackNarcs(new List() {
RomInfo.DirNames.dynamicHeaders,
RomInfo.DirNames.matrices,
RomInfo.DirNames.textArchives,
RomInfo.DirNames.areaData,
RomInfo.DirNames.headbutt,
RomInfo.DirNames.maps,
RomInfo.DirNames.mapTextures,
RomInfo.DirNames.exteriorBuildingModels,
RomInfo.DirNames.interiorBuildingModels, //No trees in interior maps, but fixes exceptions. @AdAstra - 11.06.2024
RomInfo.DirNames.buildingTextures,
});
width = openGlPictureBox.Width;
height = openGlPictureBox.Height;
openGlControl = new SimpleOpenGlControl2();
openGlControl.InitializeContexts();
openGlControl.Width = width;
openGlControl.Height = height;
openGlControl.Invalidate();
openGlControl.MakeCurrent();
List headerListBoxNames = Helpers.getHeaderListBoxNames();
Color selectedColor = Color.FromArgb(255, Color.White);
selectedPen = new Pen(selectedColor);
Color normalColor = Color.FromArgb(128, Color.DarkBlue);
normalPen = new Pen(normalColor);
normalBrush = new SolidBrush(normalColor);
Color specialColor = Color.FromArgb(128, Color.DarkRed);
specialPen = new Pen(specialColor);
specialBrush = new SolidBrush(specialColor);
Helpers.DisableHandlers();
for (int i = 0; i < Filesystem.GetHeadbuttCount(); i++) {
if (i < headerListBoxNames.Count) {
headbuttFileComboBox.Items.Add(headerListBoxNames[i]);
} else {
i.ToString("D4");
}
}
string[] pokemonNames = RomInfo.GetPokemonNames();
headbuttEncounterEditorTabNormal.comboBoxPokemon.Items.AddRange(pokemonNames);
headbuttEncounterEditorTabNormal.comboBoxPokemon.SelectedIndex = 0;
headbuttEncounterEditorTabNormal.listBoxTrees.SelectedIndexChanged += ListBoxTrees_SelectedIndexChanged;
headbuttEncounterEditorTabSpecial.comboBoxPokemon.Items.AddRange(pokemonNames);
headbuttEncounterEditorTabSpecial.comboBoxPokemon.SelectedIndex = 0;
headbuttEncounterEditorTabSpecial.listBoxTrees.SelectedIndexChanged += ListBoxTrees_SelectedIndexChanged;
openGlPictureBox.BringToFront();
SetCam2DValues();
Helpers.EnableHandlers();
if (headbuttFileComboBox.Items.Count > 0) {
headbuttFileComboBox.SelectedIndex = 0;
}
}
public void makeCurrent() {
openGlControl.MakeCurrent();
}
private void comboBoxMapHeader_SelectedIndexChanged(object sender, EventArgs e) {
ushort headbuttID = (ushort)headbuttFileComboBox.SelectedIndex;
this.headbuttEncounterFile = new HeadbuttEncounterFile(headbuttID);
setCurrentMap(headbuttEncounterFile);
}
public void setCurrentMap(HeadbuttEncounterFile headbuttEncounterFile) {
this.mapFile = null;
this.headbuttEncounterMap = null;
comboBoxMapFile.Items.Clear();
labelLocationName.Text = "";
listBoxTrees = null;
if (headbuttTree != null) { headbuttTree.picked = false; }
headbuttTree = null;
headbuttEncounterEditorTabNormal.Reset();
headbuttEncounterEditorTabSpecial.Reset();
numericUpDownTreeGlobalX.Value = 0;
numericUpDownTreeGlobalY.Value = 0;
numericUpDownTreeMatrixX.Value = 0;
numericUpDownTreeMatrixY.Value = 0;
numericUpDownTreeMapX.Value = 0;
numericUpDownTreeMapY.Value = 0;
RenderBackground();
try {
if (headbuttEncounterFile.ID == GameMatrix.EMPTY) { return; }
this.mapHeader = (HeaderHGSS)MapHeader.GetMapHeader(headbuttEncounterFile.ID);
} catch (Exception ex) {
//most likely more headbutt files than map headers
//there should be the same amount
Console.WriteLine(ex);
return;
}
this.gameMatrix = new GameMatrix(mapHeader.matrixID);
this.areaData = new AreaData(mapHeader.areaDataID);
TextArchive currentTextArchive = new TextArchive(RomInfo.locationNamesTextNumber);
this.locationName = currentTextArchive.messages[mapHeader.locationName];
labelLocationName.Text = locationName;
headbuttEncounterEditorTabNormal.SetHeadbuttEncounter(headbuttEncounterFile.normalEncounters, headbuttEncounterFile.normalTreeGroups);
headbuttEncounterEditorTabSpecial.SetHeadbuttEncounter(headbuttEncounterFile.specialEncounters, headbuttEncounterFile.specialTreeGroups);
List mapHeaderMapsIDsList = new List();
if (gameMatrix.hasHeadersSection) {
for (int y = 0; y < gameMatrix.height; y++) {
for (int x = 0; x < gameMatrix.width; x++) {
if (gameMatrix.headers[y, x] == mapHeader.ID) {
int mapID = gameMatrix.maps[y, x];
if (mapID != GameMatrix.EMPTY) {
HeadbuttEncounterMap map = new HeadbuttEncounterMap(mapID, x, y);
if (!mapHeaderMapsIDsList.Contains(map)) {
mapHeaderMapsIDsList.Add(map);
}
}
}
}
}
} else {
for (int y = 0; y < gameMatrix.height; y++) {
for (int x = 0; x < gameMatrix.width; x++) {
int mapID = gameMatrix.maps[y, x];
if (mapID != GameMatrix.EMPTY) {
HeadbuttEncounterMap map = new HeadbuttEncounterMap(mapID, x, y);
if (!mapHeaderMapsIDsList.Contains(map)) {
mapHeaderMapsIDsList.Add(map);
}
}
}
}
}
foreach (HeadbuttTreeGroup treeGroup in headbuttEncounterFile.normalTreeGroups) {
foreach (HeadbuttTree tree in treeGroup.trees) {
if (!tree.IsUnused && tree.matrixX < gameMatrix.width && tree.matrixY < gameMatrix.height) {
int mapID = gameMatrix.maps[tree.matrixY, tree.matrixX];
if (mapID != GameMatrix.EMPTY) {
HeadbuttEncounterMap map = new HeadbuttEncounterMap(mapID, tree.matrixX, tree.matrixY);
if (!mapHeaderMapsIDsList.Contains(map)) {
mapHeaderMapsIDsList.Add(map);
}
}
}
}
}
foreach (HeadbuttTreeGroup treeGroup in headbuttEncounterFile.specialTreeGroups) {
foreach (HeadbuttTree tree in treeGroup.trees) {
if (!tree.IsUnused && tree.matrixX < gameMatrix.width && tree.matrixY < gameMatrix.height) {
int mapID = gameMatrix.maps[tree.matrixY, tree.matrixX];
if (mapID != GameMatrix.EMPTY) {
HeadbuttEncounterMap map = new HeadbuttEncounterMap(mapID, tree.matrixX, tree.matrixY);
if (!mapHeaderMapsIDsList.Contains(map)) {
mapHeaderMapsIDsList.Add(map);
}
}
}
}
}
mapHeaderMapsIDsList.Sort((first, second) => {
int ret = first.mapID.CompareTo(second.mapID);
return ret == 0 ? first.x.CompareTo(second.x) : ret;
});
foreach (HeadbuttEncounterMap map in mapHeaderMapsIDsList) {
comboBoxMapFile.Items.Add(map);
}
if (comboBoxMapFile.Items.Count > 0) {
comboBoxMapFile.SelectedIndex = 0;
}
}
private void buttonSave_Click(object sender, EventArgs e) {
if (headbuttEncounterFile == null) { return; }
headbuttEncounterFile.SaveToFile();
}
private void buttonSaveAs_Click(object sender, EventArgs e) {
if (headbuttEncounterFile == null) { return; }
SaveFileDialog sfd = new SaveFileDialog();
try {
sfd.InitialDirectory = Path.GetDirectoryName(sfd.FileName);
sfd.FileName = Path.GetFileName(sfd.FileName);
} catch (Exception ex) {
sfd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.UserProfile.ToString());
sfd.FileName = Path.GetFileName(sfd.FileName);
}
if (sfd.ShowDialog() != DialogResult.OK) { return; }
headbuttEncounterFile.SaveToFile(sfd.FileName);
}
private void buttonImport_Click(object sender, EventArgs e) {
OpenFileDialog ofd = new OpenFileDialog();
try {
ofd.InitialDirectory = Path.GetDirectoryName(ofd.FileName);
ofd.FileName = Path.GetFileName(ofd.FileName);
} catch (Exception) {
ofd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.UserProfile.ToString());
ofd.FileName = Path.GetFileName(ofd.FileName);
}
if (ofd.ShowDialog() != DialogResult.OK) {
return;
}
this.headbuttEncounterFile = new HeadbuttEncounterFile(ofd.FileName);
headbuttEncounterFile.ID = (ushort)headbuttFileComboBox.SelectedIndex;
setCurrentMap(headbuttEncounterFile);
}
private void comboBoxMapFile_SelectedIndexChanged(object sender, EventArgs e) {
HeadbuttEncounterMap map = comboBoxMapFile.SelectedItem as HeadbuttEncounterMap;
int mapID = gameMatrix.maps[map.y, map.x];
this.mapFile = new MapFile(mapID, RomInfo.gameFamily, discardMoveperms: true);
this.headbuttEncounterMap = map;
RenderBackground();
}
private Bitmap GetMapBitmap() {
Bitmap bm = RenderMap();
openGlControl.Invalidate();
return bm;
}
private void RenderBackground() {
Bitmap bm = GetMapBitmap();
if (headbuttEncounterFile != null) {
using (Graphics g = Graphics.FromImage(bm)) {
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
MarkTrees(g, headbuttEncounterFile.normalTreeGroups, HeadbuttTree.Types.Normal);
MarkTrees(g, headbuttEncounterFile.specialTreeGroups, HeadbuttTree.Types.Special);
}
}
openGlPictureBox.BackgroundImage = bm;
}
private Bitmap RenderMap() {
MapFile currentMapFile = this.mapFile;
if (currentMapFile == null) {
Bitmap blank = new Bitmap(openGlPictureBox.Width, openGlPictureBox.Height);
using (Graphics g = Graphics.FromImage(blank)) {
g.Clear(Color.Black);
}
return blank;
}
Helpers.MW_LoadModelTextures(currentMapFile, areaData.mapTileset);
bool isInteriorMap = false;
if (RomInfo.gameFamily == RomInfo.GameFamilies.HGSS && areaData.areaType == AreaData.TYPE_INDOOR) {
isInteriorMap = true;
}
for (int i = 0; i < currentMapFile.buildings.Count; i++) {
Building building = currentMapFile.buildings[i];
building.LoadModelData(isInteriorMap); // Load building nsbmd
Helpers.MW_LoadModelTextures(building, areaData.buildingsTileset); // Load building textures
}
Helpers.RenderMap(ref currentMapFile, openGlControl.Width, openGlControl.Height, ang, dist, elev, perspective);
return Helpers.GrabMapScreenshot(width, height);
}
private void MarkTrees(Graphics g, BindingList treeGroups, HeadbuttTree.Types treeType) {
HeadbuttEncounterMap map = comboBoxMapFile.SelectedItem as HeadbuttEncounterMap;
if (map != null) {
foreach (HeadbuttTreeGroup treeGroup in treeGroups) {
foreach (HeadbuttTree tree in treeGroup.trees) {
if (!tree.IsUnused && tree.matrixX == map.x && tree.matrixY == map.y) {
MarkTree(g, tree, treeType);
}
}
}
}
}
private void MarkTree(Graphics g, HeadbuttTree tree, HeadbuttTree.Types treeType) {
Pen paintPen;
SolidBrush paintBrush;
if (treeType == HeadbuttTree.Types.Normal) {
paintPen = normalPen;
paintBrush = normalBrush;
} else {
paintPen = specialPen;
paintBrush = specialBrush;
}
if (tree.picked) {
paintPen = selectedPen;
}
int tileWidth = openGlControl.Width / MapFile.mapSize;
int tileHeight = openGlControl.Height / MapFile.mapSize;
int tileX = tree.mapX * tileWidth;
int tileY = tree.mapY * tileHeight;
int padding = 1;
Rectangle rectangle = new Rectangle(tileX + padding, tileY + padding, tileWidth - padding, tileHeight - padding);
g.FillRectangle(paintBrush, rectangle);
g.DrawRectangle(paintPen, rectangle);
}
private void ListBoxTrees_SelectedIndexChanged(object sender, EventArgs e) {
listBoxTrees = sender as ListBox2;
headbuttTree = listBoxTrees.SelectedItem as HeadbuttTree;
if (headbuttTree == null) {
return;
}
numericUpDownTreeGlobalX.Value = headbuttTree.globalX;
numericUpDownTreeGlobalY.Value = headbuttTree.globalY;
numericUpDownTreeMatrixX.Value = headbuttTree.matrixX;
numericUpDownTreeMatrixY.Value = headbuttTree.matrixY;
numericUpDownTreeMapX.Value = headbuttTree.mapX;
numericUpDownTreeMapY.Value = headbuttTree.mapY;
}
private void openGlPictureBox_Click(object sender, EventArgs e) {
MouseEventArgs mea = (MouseEventArgs)e;
int tileWidth = openGlControl.Width / MapFile.mapSize;
int tileHeight = openGlControl.Height / MapFile.mapSize;
int mouseX = openGlPictureBox.PointToClient(MousePosition).X / tileWidth;
int mouseY = openGlPictureBox.PointToClient(MousePosition).Y / tileHeight;
if (mea.Button == MouseButtons.Left) {
if (this.headbuttEncounterMap != null) {
numericUpDownTreeMatrixX.Value = headbuttEncounterMap.x;
numericUpDownTreeMatrixY.Value = headbuttEncounterMap.y;
numericUpDownTreeMapX.Value = mouseX;
numericUpDownTreeMapY.Value = mouseY;
}
} else if (mea.Button == MouseButtons.Middle) {
//warp
} else if (mea.Button == MouseButtons.Right) {
if (headbuttTree != null) { headbuttTree.picked = false; }
if (FindTreeFromMap(headbuttEncounterEditorTabNormal.listBoxTreeGroups, headbuttEncounterEditorTabNormal.listBoxTrees, mouseX, mouseY)) {
tabControl.SelectedTab = tabPageNormal;
} else if (FindTreeFromMap(headbuttEncounterEditorTabSpecial.listBoxTreeGroups, headbuttEncounterEditorTabSpecial.listBoxTrees, mouseX, mouseY)) {
tabControl.SelectedTab = tabPageSpecial;
} else {
headbuttEncounterEditorTabNormal.listBoxTreeGroups.SelectedItem = null;
headbuttEncounterEditorTabNormal.listBoxTrees.SelectedItem = null;
headbuttEncounterEditorTabSpecial.listBoxTreeGroups.SelectedItem = null;
headbuttEncounterEditorTabSpecial.listBoxTrees.SelectedItem = null;
}
}
RenderBackground();
}
private bool FindTreeFromMap(ListBox2 listBoxTreeGroups, ListBox2 listBoxTrees, int x, int y) {
foreach (HeadbuttTreeGroup headbuttTreeGroup in listBoxTreeGroups.Items) {
foreach (HeadbuttTree tree in headbuttTreeGroup.trees) {
if (tree.mapX == x && tree.mapY == y) {
listBoxTreeGroups.SelectedItem = headbuttTreeGroup;
listBoxTrees.SelectedItem = tree;
tree.picked = true;
return true;
}
}
}
return false;
}
private void numericUpDownTreeGlobalX_ValueChanged(object sender, EventArgs e) {
if (headbuttTree == null) { return; }
headbuttTree.globalX = (ushort)((NumericUpDown)sender).Value;
listBoxTrees.RefreshItem(listBoxTrees.SelectedIndex);
}
private void numericUpDownTreeGlobalY_ValueChanged(object sender, EventArgs e) {
if (headbuttTree == null) { return; }
headbuttTree.globalY = (ushort)((NumericUpDown)sender).Value;
listBoxTrees.RefreshItem(listBoxTrees.SelectedIndex);
}
private void numericUpDownTreeMatrixX_ValueChanged(object sender, EventArgs e) {
if (headbuttTree == null) { return; }
headbuttTree.matrixX = (ushort)((NumericUpDown)sender).Value;
listBoxTrees.RefreshItem(listBoxTrees.SelectedIndex);
}
private void numericUpDownTreeMatrixY_ValueChanged(object sender, EventArgs e) {
if (headbuttTree == null) { return; }
headbuttTree.matrixY = (ushort)((NumericUpDown)sender).Value;
listBoxTrees.RefreshItem(listBoxTrees.SelectedIndex);
}
private void numericUpDownTreeMapX_ValueChanged(object sender, EventArgs e) {
if (headbuttTree == null) { return; }
headbuttTree.mapX = (ushort)((NumericUpDown)sender).Value;
listBoxTrees.RefreshItem(listBoxTrees.SelectedIndex);
}
private void numericUpDownTreeMapY_ValueChanged(object sender, EventArgs e) {
if (headbuttTree == null) { return; }
headbuttTree.mapY = (ushort)((NumericUpDown)sender).Value;
listBoxTrees.RefreshItem(listBoxTrees.SelectedIndex);
}
private void mapScreenshotButton_Click(object sender, EventArgs e) {
SaveFileDialog imageSFD = new SaveFileDialog {
Filter = "PNG File(*.png)|*.png"
};
if (imageSFD.ShowDialog() != DialogResult.OK) {
return;
}
openGlPictureBox.BackgroundImage.Save(imageSFD.FileName);
MessageBox.Show("Screenshot saved.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void SetCam2DValues() {
perspective = 4f;
ang = 0f;
dist = 115.2f;
elev = 90f;
}
}
}
================================================
FILE: DS_Map/Editors/HeadbuttEncounterEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/Editors/HeadbuttEncounterEditorTab.Designer.cs
================================================
namespace DSPRE.Editors
{
partial class HeadbuttEncounterEditorTab
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
this.buttonDuplicateTreeGroup = new System.Windows.Forms.Button();
this.buttonRemoveTreeGroup = new System.Windows.Forms.Button();
this.numericUpDownMaxLevel = new System.Windows.Forms.NumericUpDown();
this.numericUpDownMinLevel = new System.Windows.Forms.NumericUpDown();
this.buttonAddTreeGroup = new System.Windows.Forms.Button();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.comboBoxPokemon = new System.Windows.Forms.ComboBox();
this.listBoxTreeGroups = new DSPRE.ListBox2();
this.listBoxTrees = new DSPRE.ListBox2();
this.listBoxEncounters = new DSPRE.ListBox2();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxLevel)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinLevel)).BeginInit();
this.SuspendLayout();
//
// buttonDuplicateTreeGroup
//
this.buttonDuplicateTreeGroup.Image = global::DSPRE.Properties.Resources.copyIcon_small;
this.buttonDuplicateTreeGroup.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonDuplicateTreeGroup.Location = new System.Drawing.Point(177, 386);
this.buttonDuplicateTreeGroup.Name = "buttonDuplicateTreeGroup";
this.buttonDuplicateTreeGroup.Size = new System.Drawing.Size(81, 26);
this.buttonDuplicateTreeGroup.TabIndex = 17;
this.buttonDuplicateTreeGroup.Text = "Duplicate";
this.buttonDuplicateTreeGroup.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonDuplicateTreeGroup.UseVisualStyleBackColor = true;
this.buttonDuplicateTreeGroup.Click += new System.EventHandler(this.buttonDuplicateTreeGroup_Click);
//
// buttonRemoveTreeGroup
//
this.buttonRemoveTreeGroup.Image = global::DSPRE.Properties.Resources.deleteIcon;
this.buttonRemoveTreeGroup.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonRemoveTreeGroup.Location = new System.Drawing.Point(90, 386);
this.buttonRemoveTreeGroup.Name = "buttonRemoveTreeGroup";
this.buttonRemoveTreeGroup.Size = new System.Drawing.Size(81, 26);
this.buttonRemoveTreeGroup.TabIndex = 17;
this.buttonRemoveTreeGroup.Text = "Remove";
this.buttonRemoveTreeGroup.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonRemoveTreeGroup.UseVisualStyleBackColor = true;
this.buttonRemoveTreeGroup.Click += new System.EventHandler(this.buttonRemoveTreeGroup_Click);
//
// numericUpDownMaxLevel
//
this.numericUpDownMaxLevel.Location = new System.Drawing.Point(200, 207);
this.numericUpDownMaxLevel.Name = "numericUpDownMaxLevel";
this.numericUpDownMaxLevel.Size = new System.Drawing.Size(58, 20);
this.numericUpDownMaxLevel.TabIndex = 15;
this.numericUpDownMaxLevel.ValueChanged += new System.EventHandler(this.numericUpDownMaxLevel_ValueChanged);
//
// numericUpDownMinLevel
//
this.numericUpDownMinLevel.Location = new System.Drawing.Point(136, 207);
this.numericUpDownMinLevel.Name = "numericUpDownMinLevel";
this.numericUpDownMinLevel.Size = new System.Drawing.Size(58, 20);
this.numericUpDownMinLevel.TabIndex = 15;
this.numericUpDownMinLevel.ValueChanged += new System.EventHandler(this.numericUpDownMinLevel_ValueChanged);
//
// buttonAddTreeGroup
//
this.buttonAddTreeGroup.Image = global::DSPRE.Properties.Resources.addIcon;
this.buttonAddTreeGroup.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonAddTreeGroup.Location = new System.Drawing.Point(3, 386);
this.buttonAddTreeGroup.Name = "buttonAddTreeGroup";
this.buttonAddTreeGroup.Size = new System.Drawing.Size(81, 26);
this.buttonAddTreeGroup.TabIndex = 17;
this.buttonAddTreeGroup.Text = "Add";
this.buttonAddTreeGroup.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonAddTreeGroup.UseVisualStyleBackColor = true;
this.buttonAddTreeGroup.Click += new System.EventHandler(this.buttonAddTreeGroup_Click);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(0, 233);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(66, 13);
this.label5.TabIndex = 18;
this.label5.Text = "Tree Groups";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(0, 415);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(118, 13);
this.label6.TabIndex = 18;
this.label6.Text = "Trees in selected group";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(0, 190);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(97, 13);
this.label2.TabIndex = 18;
this.label2.Text = "Selected Pokémon";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(133, 190);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.TabIndex = 18;
this.label3.Text = "Min Level";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(86, 13);
this.label1.TabIndex = 18;
this.label1.Text = "Encounter Table";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(197, 190);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(56, 13);
this.label4.TabIndex = 18;
this.label4.Text = "Max Level";
//
// comboBoxPokemon
//
this.comboBoxPokemon.FormattingEnabled = true;
this.comboBoxPokemon.Location = new System.Drawing.Point(3, 206);
this.comboBoxPokemon.Name = "comboBoxPokemon";
this.comboBoxPokemon.Size = new System.Drawing.Size(127, 21);
this.comboBoxPokemon.TabIndex = 19;
this.comboBoxPokemon.SelectedIndexChanged += new System.EventHandler(this.comboBoxPokemon_SelectedIndexChanged);
//
// listBoxTreeGroups
//
this.listBoxTreeGroups.DisplayMember = "DisplayName";
this.listBoxTreeGroups.FormattingEnabled = true;
this.listBoxTreeGroups.Location = new System.Drawing.Point(3, 249);
this.listBoxTreeGroups.Name = "listBoxTreeGroups";
this.listBoxTreeGroups.Size = new System.Drawing.Size(255, 134);
this.listBoxTreeGroups.TabIndex = 11;
this.listBoxTreeGroups.SelectedIndexChanged += new System.EventHandler(this.listBoxTreeGroups_SelectedIndexChanged);
//
// listBoxTrees
//
this.listBoxTrees.DisplayMember = "DisplayName";
this.listBoxTrees.FormattingEnabled = true;
this.listBoxTrees.Location = new System.Drawing.Point(3, 431);
this.listBoxTrees.Name = "listBoxTrees";
this.listBoxTrees.Size = new System.Drawing.Size(255, 82);
this.listBoxTrees.TabIndex = 11;
//
// listBoxEncounters
//
this.listBoxEncounters.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listBoxEncounters.FormattingEnabled = true;
this.listBoxEncounters.ItemHeight = 14;
this.listBoxEncounters.Location = new System.Drawing.Point(3, 15);
this.listBoxEncounters.Name = "listBoxEncounters";
this.listBoxEncounters.Size = new System.Drawing.Size(255, 172);
this.listBoxEncounters.TabIndex = 13;
this.listBoxEncounters.SelectedIndexChanged += new System.EventHandler(this.listBoxEncounters_SelectedIndexChanged);
//
// HeadbuttEncounterEditorTab
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.comboBoxPokemon);
this.Controls.Add(this.label4);
this.Controls.Add(this.label1);
this.Controls.Add(this.listBoxTreeGroups);
this.Controls.Add(this.label3);
this.Controls.Add(this.buttonDuplicateTreeGroup);
this.Controls.Add(this.label2);
this.Controls.Add(this.buttonRemoveTreeGroup);
this.Controls.Add(this.listBoxTrees);
this.Controls.Add(this.label6);
this.Controls.Add(this.numericUpDownMaxLevel);
this.Controls.Add(this.listBoxEncounters);
this.Controls.Add(this.label5);
this.Controls.Add(this.numericUpDownMinLevel);
this.Controls.Add(this.buttonAddTreeGroup);
this.Name = "HeadbuttEncounterEditorTab";
this.Size = new System.Drawing.Size(262, 517);
((System.ComponentModel.ISupportInitialize)(this.numericUpDownMaxLevel)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownMinLevel)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
public DSPRE.ListBox2 listBoxTreeGroups;
private System.Windows.Forms.Button buttonDuplicateTreeGroup;
private System.Windows.Forms.Button buttonRemoveTreeGroup;
public ListBox2 listBoxTrees;
public System.Windows.Forms.NumericUpDown numericUpDownMaxLevel;
public DSPRE.ListBox2 listBoxEncounters;
public System.Windows.Forms.NumericUpDown numericUpDownMinLevel;
private System.Windows.Forms.Button buttonAddTreeGroup;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label4;
public System.Windows.Forms.ComboBox comboBoxPokemon;
}
}
================================================
FILE: DS_Map/Editors/HeadbuttEncounterEditorTab.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using DSPRE.ROMFiles;
namespace DSPRE.Editors {
public partial class HeadbuttEncounterEditorTab : UserControl {
private List encounters;
private BindingList treeGroups;
public HeadbuttEncounterEditorTab() {
InitializeComponent();
}
public void Reset() {
Helpers.DisableHandlers();
listBoxEncounters.DataSource = null;
listBoxTreeGroups.DataSource = null;
listBoxTrees.DataSource = null;
comboBoxPokemon.SelectedIndex = 0;
numericUpDownMinLevel.Value = 0;
numericUpDownMaxLevel.Value = 0;
Helpers.EnableHandlers();
}
public void SetHeadbuttEncounter(List encounters, BindingList treeGroups) {
Helpers.DisableHandlers();
this.encounters = encounters;
this.treeGroups = treeGroups;
listBoxEncounters.DataSource = this.encounters;
listBoxTreeGroups.DataSource = this.treeGroups;
listBoxEncounters.SelectedIndex = -1;
listBoxTreeGroups.SelectedIndex = -1;
Helpers.EnableHandlers();
}
private void listBoxEncounters_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled) { return; }
HeadbuttEncounter headbuttEncounter = (HeadbuttEncounter)listBoxEncounters.SelectedItem;
if (headbuttEncounter == null) { return; }
comboBoxPokemon.SelectedIndex = headbuttEncounter.pokemonID;
numericUpDownMinLevel.Value = headbuttEncounter.minLevel;
numericUpDownMaxLevel.Value = headbuttEncounter.maxLevel;
}
private void comboBoxPokemon_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled) { return; }
HeadbuttEncounter headbuttEncounter = (HeadbuttEncounter)listBoxEncounters.SelectedItem;
if (headbuttEncounter == null) { return; }
headbuttEncounter.pokemonID = (ushort)comboBoxPokemon.SelectedIndex;
listBoxEncounters.RefreshItem(listBoxEncounters.SelectedIndex);
}
private void numericUpDownMinLevel_ValueChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled) { return; }
HeadbuttEncounter headbuttEncounter = (HeadbuttEncounter)listBoxEncounters.SelectedItem;
if (headbuttEncounter == null) { return; }
headbuttEncounter.minLevel = (byte)numericUpDownMinLevel.Value;
listBoxEncounters.RefreshItem(listBoxEncounters.SelectedIndex);
}
private void numericUpDownMaxLevel_ValueChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled) { return; }
HeadbuttEncounter headbuttEncounter = (HeadbuttEncounter)listBoxEncounters.SelectedItem;
if (headbuttEncounter == null) { return; }
headbuttEncounter.maxLevel = (byte)numericUpDownMaxLevel.Value;
listBoxEncounters.RefreshItem(listBoxEncounters.SelectedIndex);
}
private void listBoxTreeGroups_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled) { return; }
HeadbuttTreeGroup headbuttTreeGroup = (HeadbuttTreeGroup)listBoxTreeGroups.SelectedItem;
if (headbuttTreeGroup == null) { return; }
listBoxTrees.DataSource = headbuttTreeGroup.trees;
}
private void buttonAddTreeGroup_Click(object sender, EventArgs e) {
treeGroups.Add(new HeadbuttTreeGroup());
}
private void buttonRemoveTreeGroup_Click(object sender, EventArgs e) {
int selectedIndex = listBoxTreeGroups.SelectedIndex;
if (selectedIndex == -1) { return; }
treeGroups.RemoveAt(selectedIndex);
}
private void buttonDuplicateTreeGroup_Click(object sender, EventArgs e) {
HeadbuttTreeGroup headbuttTreeGroup = (HeadbuttTreeGroup)listBoxTreeGroups.SelectedItem;
if (headbuttTreeGroup == null) { return; }
treeGroups.Add(new HeadbuttTreeGroup(headbuttTreeGroup));
}
}
}
================================================
FILE: DS_Map/Editors/HeadbuttEncounterEditorTab.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/Editors/LevelScriptEditor.Designer.cs
================================================
using System.ComponentModel;
namespace DSPRE.Editors {
partial class LevelScriptEditor {
///
/// Required designer variable.
///
private IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LevelScriptEditor));
this.buttonSave = new System.Windows.Forms.Button();
this.buttonExport = new System.Windows.Forms.Button();
this.radioButtonVariableValue = new System.Windows.Forms.RadioButton();
this.radioButtonMapChange = new System.Windows.Forms.RadioButton();
this.radioButtonScreenReset = new System.Windows.Forms.RadioButton();
this.radioButtonLoadGame = new System.Windows.Forms.RadioButton();
this.textBoxScriptID = new System.Windows.Forms.TextBox();
this.textBoxVariableName = new System.Windows.Forms.TextBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBoxScript = new System.Windows.Forms.GroupBox();
this.groupBoxVariable = new System.Windows.Forms.GroupBox();
this.groupBoxValue = new System.Windows.Forms.GroupBox();
this.textBoxVariableValue = new System.Windows.Forms.TextBox();
this.checkBoxPadding = new System.Windows.Forms.CheckBox();
this.buttonAdd = new System.Windows.Forms.Button();
this.buttonRemove = new System.Windows.Forms.Button();
this.radioButtonDecimal = new System.Windows.Forms.RadioButton();
this.radioButtonHex = new System.Windows.Forms.RadioButton();
this.radioButtonAuto = new System.Windows.Forms.RadioButton();
this.selectScriptFileComboBox = new System.Windows.Forms.ComboBox();
this.listBoxTriggers = new DSPRE.ListBox2();
this.buttonOpenHeaderScript = new System.Windows.Forms.Button();
this.buttonOpenSelectedScript = new System.Windows.Forms.Button();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.buttonLocate = new System.Windows.Forms.Button();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.buttonImport = new System.Windows.Forms.Button();
this.groupBox5 = new System.Windows.Forms.GroupBox();
this.groupBox6 = new System.Windows.Forms.GroupBox();
this.groupBox7 = new System.Windows.Forms.GroupBox();
this.groupBox1.SuspendLayout();
this.groupBoxScript.SuspendLayout();
this.groupBoxVariable.SuspendLayout();
this.groupBoxValue.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
this.groupBox5.SuspendLayout();
this.groupBox6.SuspendLayout();
this.groupBox7.SuspendLayout();
this.SuspendLayout();
//
// buttonSave
//
this.buttonSave.Image = global::DSPRE.Properties.Resources.save_rom;
this.buttonSave.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonSave.Location = new System.Drawing.Point(176, 17);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(80, 40);
this.buttonSave.TabIndex = 5;
this.buttonSave.Text = "Save";
this.buttonSave.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
//
// buttonExport
//
this.buttonExport.Image = global::DSPRE.Properties.Resources.exportArrow;
this.buttonExport.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonExport.Location = new System.Drawing.Point(90, 17);
this.buttonExport.Name = "buttonExport";
this.buttonExport.Size = new System.Drawing.Size(80, 40);
this.buttonExport.TabIndex = 6;
this.buttonExport.Text = "Export";
this.buttonExport.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonExport.UseVisualStyleBackColor = true;
this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click);
//
// radioButtonVariableValue
//
this.radioButtonVariableValue.Checked = true;
this.radioButtonVariableValue.Location = new System.Drawing.Point(8, 17);
this.radioButtonVariableValue.Name = "radioButtonVariableValue";
this.radioButtonVariableValue.Size = new System.Drawing.Size(99, 38);
this.radioButtonVariableValue.TabIndex = 12;
this.radioButtonVariableValue.TabStop = true;
this.radioButtonVariableValue.Text = "Continuous\r\nVariable Check\r\n";
this.radioButtonVariableValue.UseVisualStyleBackColor = true;
this.radioButtonVariableValue.CheckedChanged += new System.EventHandler(this.radioButtonVariableValue_CheckedChanged);
//
// radioButtonMapChange
//
this.radioButtonMapChange.Location = new System.Drawing.Point(120, 17);
this.radioButtonMapChange.Name = "radioButtonMapChange";
this.radioButtonMapChange.Size = new System.Drawing.Size(75, 38);
this.radioButtonMapChange.TabIndex = 13;
this.radioButtonMapChange.Text = "Player enters";
this.radioButtonMapChange.UseVisualStyleBackColor = true;
this.radioButtonMapChange.CheckedChanged += new System.EventHandler(this.radioButtonMapChange_CheckedChanged);
//
// radioButtonScreenReset
//
this.radioButtonScreenReset.Location = new System.Drawing.Point(211, 17);
this.radioButtonScreenReset.Name = "radioButtonScreenReset";
this.radioButtonScreenReset.Size = new System.Drawing.Size(66, 38);
this.radioButtonScreenReset.TabIndex = 14;
this.radioButtonScreenReset.Text = "Screen Refresh";
this.radioButtonScreenReset.UseVisualStyleBackColor = true;
this.radioButtonScreenReset.CheckedChanged += new System.EventHandler(this.radioButtonScreenReset_CheckedChanged);
//
// radioButtonLoadGame
//
this.radioButtonLoadGame.Location = new System.Drawing.Point(300, 17);
this.radioButtonLoadGame.Name = "radioButtonLoadGame";
this.radioButtonLoadGame.Size = new System.Drawing.Size(94, 38);
this.radioButtonLoadGame.TabIndex = 15;
this.radioButtonLoadGame.Text = "Overworld System loads";
this.radioButtonLoadGame.UseVisualStyleBackColor = true;
this.radioButtonLoadGame.CheckedChanged += new System.EventHandler(this.radioButtonLoadGame_CheckedChanged);
//
// textBoxScriptID
//
this.textBoxScriptID.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBoxScriptID.Location = new System.Drawing.Point(3, 16);
this.textBoxScriptID.Name = "textBoxScriptID";
this.textBoxScriptID.Size = new System.Drawing.Size(143, 20);
this.textBoxScriptID.TabIndex = 16;
this.textBoxScriptID.TextChanged += new System.EventHandler(this.textBoxScriptID_TextChanged);
//
// textBoxVariableName
//
this.textBoxVariableName.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBoxVariableName.Location = new System.Drawing.Point(3, 16);
this.textBoxVariableName.Name = "textBoxVariableName";
this.textBoxVariableName.Size = new System.Drawing.Size(123, 20);
this.textBoxVariableName.TabIndex = 17;
this.textBoxVariableName.TextChanged += new System.EventHandler(this.textBoxVariableName_TextChanged);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.radioButtonVariableValue);
this.groupBox1.Controls.Add(this.radioButtonMapChange);
this.groupBox1.Controls.Add(this.radioButtonScreenReset);
this.groupBox1.Controls.Add(this.radioButtonLoadGame);
this.groupBox1.Location = new System.Drawing.Point(3, 411);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(397, 63);
this.groupBox1.TabIndex = 11;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Activation Condition";
//
// groupBoxScript
//
this.groupBoxScript.Controls.Add(this.textBoxScriptID);
this.groupBoxScript.Location = new System.Drawing.Point(3, 480);
this.groupBoxScript.Name = "groupBoxScript";
this.groupBoxScript.Size = new System.Drawing.Size(149, 46);
this.groupBoxScript.TabIndex = 12;
this.groupBoxScript.TabStop = false;
this.groupBoxScript.Text = "Keep running this Script ID";
//
// groupBoxVariable
//
this.groupBoxVariable.Controls.Add(this.textBoxVariableName);
this.groupBoxVariable.Location = new System.Drawing.Point(155, 480);
this.groupBoxVariable.Name = "groupBoxVariable";
this.groupBoxVariable.Size = new System.Drawing.Size(129, 46);
this.groupBoxVariable.TabIndex = 13;
this.groupBoxVariable.TabStop = false;
this.groupBoxVariable.Text = "as long as this variable";
//
// groupBoxValue
//
this.groupBoxValue.Controls.Add(this.textBoxVariableValue);
this.groupBoxValue.Location = new System.Drawing.Point(290, 480);
this.groupBoxValue.Name = "groupBoxValue";
this.groupBoxValue.Size = new System.Drawing.Size(110, 46);
this.groupBoxValue.TabIndex = 13;
this.groupBoxValue.TabStop = false;
this.groupBoxValue.Text = "holds this value";
//
// textBoxVariableValue
//
this.textBoxVariableValue.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBoxVariableValue.Location = new System.Drawing.Point(3, 16);
this.textBoxVariableValue.Name = "textBoxVariableValue";
this.textBoxVariableValue.Size = new System.Drawing.Size(104, 20);
this.textBoxVariableValue.TabIndex = 18;
this.textBoxVariableValue.TextChanged += new System.EventHandler(this.textBoxVariableValue_TextChanged);
//
// checkBoxPadding
//
this.checkBoxPadding.Location = new System.Drawing.Point(268, 19);
this.checkBoxPadding.Name = "checkBoxPadding";
this.checkBoxPadding.Size = new System.Drawing.Size(107, 35);
this.checkBoxPadding.TabIndex = 7;
this.checkBoxPadding.Text = "Word-alignment padding";
this.checkBoxPadding.UseVisualStyleBackColor = true;
//
// buttonAdd
//
this.buttonAdd.Image = ((System.Drawing.Image)(resources.GetObject("buttonAdd.Image")));
this.buttonAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonAdd.Location = new System.Drawing.Point(5, 18);
this.buttonAdd.Name = "buttonAdd";
this.buttonAdd.Size = new System.Drawing.Size(75, 29);
this.buttonAdd.TabIndex = 19;
this.buttonAdd.Text = "Add";
this.buttonAdd.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonAdd.UseVisualStyleBackColor = true;
this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);
//
// buttonRemove
//
this.buttonRemove.Image = global::DSPRE.Properties.Resources.deleteIcon;
this.buttonRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonRemove.Location = new System.Drawing.Point(84, 18);
this.buttonRemove.Name = "buttonRemove";
this.buttonRemove.Size = new System.Drawing.Size(75, 29);
this.buttonRemove.TabIndex = 20;
this.buttonRemove.Text = "Remove";
this.buttonRemove.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonRemove.UseVisualStyleBackColor = true;
this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
//
// radioButtonDecimal
//
this.radioButtonDecimal.AutoSize = true;
this.radioButtonDecimal.Location = new System.Drawing.Point(109, 23);
this.radioButtonDecimal.Name = "radioButtonDecimal";
this.radioButtonDecimal.Size = new System.Drawing.Size(63, 17);
this.radioButtonDecimal.TabIndex = 10;
this.radioButtonDecimal.Text = "Decimal";
this.radioButtonDecimal.UseVisualStyleBackColor = true;
this.radioButtonDecimal.CheckedChanged += new System.EventHandler(this.radioButtonDecimal_CheckedChanged);
//
// radioButtonHex
//
this.radioButtonHex.AutoSize = true;
this.radioButtonHex.Location = new System.Drawing.Point(59, 23);
this.radioButtonHex.Name = "radioButtonHex";
this.radioButtonHex.Size = new System.Drawing.Size(44, 17);
this.radioButtonHex.TabIndex = 9;
this.radioButtonHex.Text = "Hex";
this.radioButtonHex.UseVisualStyleBackColor = true;
this.radioButtonHex.CheckedChanged += new System.EventHandler(this.radioButtonHex_CheckedChanged);
//
// radioButtonAuto
//
this.radioButtonAuto.AutoSize = true;
this.radioButtonAuto.Checked = true;
this.radioButtonAuto.Location = new System.Drawing.Point(6, 23);
this.radioButtonAuto.Name = "radioButtonAuto";
this.radioButtonAuto.Size = new System.Drawing.Size(47, 17);
this.radioButtonAuto.TabIndex = 8;
this.radioButtonAuto.TabStop = true;
this.radioButtonAuto.Text = "Auto";
this.radioButtonAuto.UseVisualStyleBackColor = true;
this.radioButtonAuto.CheckedChanged += new System.EventHandler(this.radioButtonAuto_CheckedChanged);
//
// selectScriptFileComboBox
//
this.selectScriptFileComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.selectScriptFileComboBox.FormattingEnabled = true;
this.selectScriptFileComboBox.Location = new System.Drawing.Point(6, 19);
this.selectScriptFileComboBox.Name = "selectScriptFileComboBox";
this.selectScriptFileComboBox.Size = new System.Drawing.Size(188, 21);
this.selectScriptFileComboBox.TabIndex = 1;
this.selectScriptFileComboBox.SelectedIndexChanged += new System.EventHandler(this.selectScriptFileComboBox_SelectedIndexChanged);
//
// listBoxTriggers
//
this.listBoxTriggers.FormattingEnabled = true;
this.listBoxTriggers.Location = new System.Drawing.Point(3, 271);
this.listBoxTriggers.Name = "listBoxTriggers";
this.listBoxTriggers.Size = new System.Drawing.Size(397, 134);
this.listBoxTriggers.TabIndex = 11;
this.listBoxTriggers.SelectedValueChanged += new System.EventHandler(this.listBoxTriggers_SelectedValueChanged);
//
// buttonOpenHeaderScript
//
this.buttonOpenHeaderScript.Location = new System.Drawing.Point(6, 19);
this.buttonOpenHeaderScript.Name = "buttonOpenHeaderScript";
this.buttonOpenHeaderScript.Size = new System.Drawing.Size(88, 23);
this.buttonOpenHeaderScript.TabIndex = 2;
this.buttonOpenHeaderScript.Text = "Header Script";
this.buttonOpenHeaderScript.UseVisualStyleBackColor = true;
this.buttonOpenHeaderScript.Click += new System.EventHandler(this.buttonOpenHeaderScript_Click);
//
// buttonOpenSelectedScript
//
this.buttonOpenSelectedScript.Location = new System.Drawing.Point(100, 19);
this.buttonOpenSelectedScript.Name = "buttonOpenSelectedScript";
this.buttonOpenSelectedScript.Size = new System.Drawing.Size(94, 23);
this.buttonOpenSelectedScript.TabIndex = 3;
this.buttonOpenSelectedScript.Text = "Selected Script";
this.buttonOpenSelectedScript.UseVisualStyleBackColor = true;
this.buttonOpenSelectedScript.Click += new System.EventHandler(this.buttonOpenSelectedScript_Click);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.buttonLocate);
this.groupBox3.Controls.Add(this.buttonOpenSelectedScript);
this.groupBox3.Controls.Add(this.buttonOpenHeaderScript);
this.groupBox3.Location = new System.Drawing.Point(3, 61);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(263, 52);
this.groupBox3.TabIndex = 18;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Open";
//
// buttonLocate
//
this.buttonLocate.Location = new System.Drawing.Point(200, 19);
this.buttonLocate.Name = "buttonLocate";
this.buttonLocate.Size = new System.Drawing.Size(56, 23);
this.buttonLocate.TabIndex = 3;
this.buttonLocate.Text = "Locate";
this.buttonLocate.UseVisualStyleBackColor = true;
this.buttonLocate.Click += new System.EventHandler(this.buttonLocate_Click);
//
// groupBox4
//
this.groupBox4.Controls.Add(this.buttonImport);
this.groupBox4.Controls.Add(this.buttonSave);
this.groupBox4.Controls.Add(this.buttonExport);
this.groupBox4.Controls.Add(this.checkBoxPadding);
this.groupBox4.Location = new System.Drawing.Point(3, 119);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(386, 65);
this.groupBox4.TabIndex = 20;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "File";
//
// buttonImport
//
this.buttonImport.Image = ((System.Drawing.Image)(resources.GetObject("buttonImport.Image")));
this.buttonImport.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonImport.Location = new System.Drawing.Point(6, 17);
this.buttonImport.Name = "buttonImport";
this.buttonImport.Size = new System.Drawing.Size(80, 40);
this.buttonImport.TabIndex = 4;
this.buttonImport.Text = "Import";
this.buttonImport.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonImport.UseVisualStyleBackColor = true;
this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click);
//
// groupBox5
//
this.groupBox5.Controls.Add(this.buttonRemove);
this.groupBox5.Controls.Add(this.buttonAdd);
this.groupBox5.Location = new System.Drawing.Point(187, 213);
this.groupBox5.Name = "groupBox5";
this.groupBox5.Size = new System.Drawing.Size(213, 52);
this.groupBox5.TabIndex = 21;
this.groupBox5.TabStop = false;
this.groupBox5.Text = "Trigger Type";
//
// groupBox6
//
this.groupBox6.Controls.Add(this.radioButtonAuto);
this.groupBox6.Controls.Add(this.radioButtonDecimal);
this.groupBox6.Controls.Add(this.radioButtonHex);
this.groupBox6.Location = new System.Drawing.Point(3, 213);
this.groupBox6.Name = "groupBox6";
this.groupBox6.Size = new System.Drawing.Size(178, 52);
this.groupBox6.TabIndex = 22;
this.groupBox6.TabStop = false;
this.groupBox6.Text = "Number Format";
//
// groupBox7
//
this.groupBox7.Controls.Add(this.selectScriptFileComboBox);
this.groupBox7.Location = new System.Drawing.Point(3, 3);
this.groupBox7.Name = "groupBox7";
this.groupBox7.Size = new System.Drawing.Size(203, 52);
this.groupBox7.TabIndex = 23;
this.groupBox7.TabStop = false;
this.groupBox7.Text = "Script File";
//
// LevelScriptEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.Controls.Add(this.groupBox7);
this.Controls.Add(this.groupBox6);
this.Controls.Add(this.groupBox5);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBoxValue);
this.Controls.Add(this.groupBoxVariable);
this.Controls.Add(this.groupBoxScript);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.listBoxTriggers);
this.Location = new System.Drawing.Point(15, 15);
this.Name = "LevelScriptEditor";
this.Size = new System.Drawing.Size(408, 622);
this.groupBox1.ResumeLayout(false);
this.groupBoxScript.ResumeLayout(false);
this.groupBoxScript.PerformLayout();
this.groupBoxVariable.ResumeLayout(false);
this.groupBoxVariable.PerformLayout();
this.groupBoxValue.ResumeLayout(false);
this.groupBoxValue.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox4.ResumeLayout(false);
this.groupBox5.ResumeLayout(false);
this.groupBox6.ResumeLayout(false);
this.groupBox6.PerformLayout();
this.groupBox7.ResumeLayout(false);
this.ResumeLayout(false);
}
private System.Windows.Forms.Button buttonImport;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.GroupBox groupBox5;
private System.Windows.Forms.Button buttonOpenSelectedScript;
private System.Windows.Forms.GroupBox groupBox3;
public System.Windows.Forms.ComboBox selectScriptFileComboBox;
#endregion
private System.Windows.Forms.Button buttonSave;
private DSPRE.ListBox2 listBoxTriggers;
private System.Windows.Forms.Button buttonExport;
private System.Windows.Forms.RadioButton radioButtonVariableValue;
private System.Windows.Forms.RadioButton radioButtonMapChange;
private System.Windows.Forms.RadioButton radioButtonScreenReset;
private System.Windows.Forms.RadioButton radioButtonLoadGame;
private System.Windows.Forms.TextBox textBoxScriptID;
private System.Windows.Forms.TextBox textBoxVariableName;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBoxScript;
private System.Windows.Forms.GroupBox groupBoxVariable;
private System.Windows.Forms.GroupBox groupBoxValue;
private System.Windows.Forms.TextBox textBoxVariableValue;
private System.Windows.Forms.CheckBox checkBoxPadding;
private System.Windows.Forms.Button buttonAdd;
private System.Windows.Forms.Button buttonRemove;
private System.Windows.Forms.RadioButton radioButtonDecimal;
private System.Windows.Forms.RadioButton radioButtonHex;
private System.Windows.Forms.RadioButton radioButtonAuto;
private System.Windows.Forms.Button buttonOpenHeaderScript;
private System.Windows.Forms.GroupBox groupBox6;
private System.Windows.Forms.GroupBox groupBox7;
private System.Windows.Forms.Button buttonLocate;
}
}
================================================
FILE: DS_Map/Editors/LevelScriptEditor.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using DSPRE.ROMFiles;
namespace DSPRE.Editors {
public partial class LevelScriptEditor : UserControl {
public bool levelScriptEditorIsReady { get; set; } = false;
LevelScriptFile _levelScriptFile;
MainProgram _parent;
public LevelScriptEditor() {
InitializeComponent();
}
public void SetUpLevelScriptEditor(MainProgram parent, bool force = false) {
if (levelScriptEditorIsReady && !force){ return; }
levelScriptEditorIsReady = true;
this._parent = parent;
DSUtils.TryUnpackNarcs(new List { RomInfo.DirNames.scripts }); //12 = scripts Narc Dir
populate_selectScriptFileComboBox();
}
public void OpenLevelScriptEditor(MainProgram parent, int levelScriptID) {
SetUpLevelScriptEditor(parent);
selectScriptFileComboBox.SelectedIndex = levelScriptID;
EditorPanels.mainTabControl.SelectedTab = EditorPanels.levelScriptEditorTabPage;
}
private void populate_selectScriptFileComboBox(int selectedIndex = 0) {
selectScriptFileComboBox.Items.Clear();
int scriptCount = Filesystem.GetScriptCount();
for (int i = 0; i < scriptCount; i++) {
// ScriptFile currentScriptFile = new ScriptFile(i, true, true);
// selectScriptFileComboBox.Items.Add(currentScriptFile);
selectScriptFileComboBox.Items.Add($"Script File {i}");
}
selectScriptFileComboBox.SelectedIndex = selectedIndex;
}
void disableButtons() {
listBoxTriggers.DataSource = null;
textBoxScriptID.Clear();
textBoxVariableName.Clear();
textBoxVariableValue.Clear();
radioButtonVariableValue.Checked = false;
radioButtonMapChange.Checked = false;
radioButtonScreenReset.Checked = false;
radioButtonLoadGame.Checked = false;
textBoxScriptID.Enabled = false;
radioButtonVariableValue.Enabled = false;
radioButtonMapChange.Enabled = false;
radioButtonScreenReset.Enabled = false;
radioButtonLoadGame.Enabled = false;
radioButtonAuto.Enabled = false;
radioButtonHex.Enabled = false;
radioButtonDecimal.Enabled = false;
buttonImport.Enabled = false;
buttonSave.Enabled = false;
buttonExport.Enabled = false;
checkBoxPadding.Enabled = false;
buttonAdd.Enabled = false;
buttonRemove.Enabled = false;
}
void enableButtons() {
// textBoxScriptID.Enabled = true;
// textBoxVariableName.Enabled = true;
// textBoxVariableValue.Enabled = true;
radioButtonVariableValue.Enabled = true;
radioButtonMapChange.Enabled = true;
radioButtonScreenReset.Enabled = true;
radioButtonLoadGame.Enabled = true;
radioButtonAuto.Enabled = true;
radioButtonHex.Enabled = true;
radioButtonDecimal.Enabled = true;
buttonImport.Enabled = true;
buttonSave.Enabled = true;
buttonExport.Enabled = true;
checkBoxPadding.Enabled = true;
}
void buttonAdd_logic() {
buttonAdd.Enabled = false;
if (radioButtonVariableValue.Checked) {
if (!string.IsNullOrEmpty(textBoxScriptID.Text) && !string.IsNullOrEmpty(textBoxVariableName.Text) && !string.IsNullOrEmpty(textBoxVariableValue.Text)) {
buttonAdd.Enabled = true;
}
} else if (radioButtonMapChange.Checked || radioButtonScreenReset.Checked || radioButtonLoadGame.Checked) {
if (!string.IsNullOrEmpty(textBoxScriptID.Text)) {
buttonAdd.Enabled = true;
}
}
}
private void selectScriptFileComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (selectScriptFileComboBox.SelectedIndex == -1) {
buttonOpenSelectedScript.Enabled = false;
buttonOpenHeaderScript.Enabled = false;
buttonLocate.Enabled = false;
} else {
buttonOpenSelectedScript.Enabled = true;
buttonOpenHeaderScript.Enabled = true;
buttonLocate.Enabled = true;
}
disableButtons();
try {
_levelScriptFile = new LevelScriptFile(selectScriptFileComboBox.SelectedIndex);
listBoxTriggers.DataSource = _levelScriptFile.bufferSet;
if (listBoxTriggers.Items.Count > 0){ listBoxTriggers.SelectedIndex = 0; }
enableButtons();
} catch (InvalidDataException ex) { //not a level script
disableButtons();
Console.WriteLine(ex.Message);
}
}
void listBoxTriggers_SelectedValueChanged(object sender, EventArgs e) {
if (listBoxTriggers.SelectedItem == null) {
buttonRemove.Enabled = false;
return;
}
if (listBoxTriggers.SelectedItem is MapScreenLoadTrigger mapScreenLoadTrigger) {
if (mapScreenLoadTrigger.triggerType == LevelScriptTrigger.LOADGAME) {
radioButtonLoadGame.Checked = true;
} else if (mapScreenLoadTrigger.triggerType == LevelScriptTrigger.MAPCHANGE) {
radioButtonMapChange.Checked = true;
} else if (mapScreenLoadTrigger.triggerType == LevelScriptTrigger.SCREENRESET) {
radioButtonScreenReset.Checked = true;
}
} else if (listBoxTriggers.SelectedItem is VariableValueTrigger variableValueTrigger) {
if (variableValueTrigger.triggerType == LevelScriptTrigger.VARIABLEVALUE) {
radioButtonVariableValue.Checked = true;
}
}
handleAutoFormat();
handleHexFormat();
handleDecimalFormat();
textBoxScriptID.Enabled = true;
buttonRemove.Enabled = true;
}
private void buttonAdd_Click(object sender, EventArgs e) {
// try {
if (_levelScriptFile == null) {
_levelScriptFile = new LevelScriptFile();
}
int convertBase = 10; //decimal
if (radioButtonHex.Checked) {
convertBase = 16; //hex
}
if (radioButtonVariableValue.Checked) {
int scriptID = Convert.ToInt16(textBoxScriptID.Text, convertBase);
int variableName = Convert.ToInt16(textBoxVariableName.Text, convertBase);
int variableValue = Convert.ToInt16(textBoxVariableValue.Text, convertBase);
VariableValueTrigger variableValueTrigger = new VariableValueTrigger(scriptID, variableName, variableValue);
_levelScriptFile.bufferSet.Add(variableValueTrigger);
} else {
int scriptID = Convert.ToInt16(textBoxScriptID.Text, convertBase);
if (radioButtonMapChange.Checked) {
MapScreenLoadTrigger mapScreenLoadTrigger = new MapScreenLoadTrigger(LevelScriptTrigger.MAPCHANGE, scriptID);
_levelScriptFile.bufferSet.Add(mapScreenLoadTrigger);
} else if (radioButtonScreenReset.Checked) {
MapScreenLoadTrigger mapScreenLoadTrigger = new MapScreenLoadTrigger(LevelScriptTrigger.SCREENRESET, scriptID);
_levelScriptFile.bufferSet.Add(mapScreenLoadTrigger);
} else if (radioButtonLoadGame.Checked) {
MapScreenLoadTrigger mapScreenLoadTrigger = new MapScreenLoadTrigger(LevelScriptTrigger.LOADGAME, scriptID);
_levelScriptFile.bufferSet.Add(mapScreenLoadTrigger);
}
}
textBoxScriptID.Clear();
textBoxVariableName.Clear();
textBoxVariableValue.Clear();
// }
// catch (Exception exception) {
// MessageBox.Show(exception.Message);
// }
}
private void buttonRemove_Click(object sender, EventArgs e) {
_levelScriptFile.bufferSet.RemoveAt(listBoxTriggers.SelectedIndex);
}
private void buttonOpenHeaderScript_Click(object sender, EventArgs e) {
EditorPanels.scriptEditor.OpenScriptEditor(this._parent, (int)EditorPanels.MainProgram.scriptFileUpDown.Value);
}
private void buttonOpenSelectedScript_Click(object sender, EventArgs e) {
EditorPanels.scriptEditor.OpenScriptEditor(this._parent, (int)EditorPanels.levelScriptEditor.selectScriptFileComboBox.SelectedIndex);
}
void buttonLocate_Click(object sender, EventArgs e) {
if (_levelScriptFile == null){ return; }
string path = Filesystem.GetScriptPath(_levelScriptFile.ID);
Helpers.ExplorerSelect(path);
}
void buttonImport_Click(object sender, EventArgs e) {
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK) {
try {
LevelScriptFile importedFile = new LevelScriptFile();
importedFile.parse_file(ofd.FileName);
_levelScriptFile.bufferSet.Clear();
foreach (LevelScriptTrigger trigger in importedFile.bufferSet) {
_levelScriptFile.bufferSet.Add(trigger);
}
} catch (InvalidDataException ex) {
MessageBox.Show(ex.Message, ex.GetType().ToString());
}
}
}
private void buttonSave_Click(object sender, EventArgs e) {
string path = Filesystem.GetScriptPath(_levelScriptFile.ID);
saveFile(path);
}
private void buttonExport_Click(object sender, EventArgs e) {
SaveFileDialog sfd = new SaveFileDialog();
try {
sfd.InitialDirectory = Path.GetDirectoryName(sfd.FileName);
sfd.FileName = Path.GetFileName(sfd.FileName);
} catch (Exception ex) {
sfd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.UserProfile.ToString());
sfd.FileName = Path.GetFileName(sfd.FileName);
}
if (sfd.ShowDialog() == DialogResult.OK) {
saveFile(sfd.FileName);
}
}
void saveFile(string path) {
try {
long bytes_written = _levelScriptFile.write_file(path);
if (bytes_written <= 4) {
MessageBox.Show("Empty level script file was correctly saved.", "Success!");
} else {
MessageBox.Show("File was correctly saved.", "Success!");
}
} catch (Exception ex) {
MessageBox.Show(ex.Message, ex.GetType().ToString());
}
}
private void handleAutoFormat() {
if (!radioButtonAuto.Checked){ return; }
textBoxScriptID.Clear();
textBoxVariableName.Clear();
textBoxVariableValue.Clear();
if (listBoxTriggers.SelectedItem is MapScreenLoadTrigger mapScreenLoadTrigger) {
textBoxScriptID.Text = mapScreenLoadTrigger.scriptTriggered.ToString();
} else if (listBoxTriggers.SelectedItem is VariableValueTrigger variableValueTrigger) {
textBoxScriptID.Text = variableValueTrigger.scriptTriggered.ToString();
textBoxVariableName.Text = "" + variableValueTrigger.variableToWatch.ToString("D");
textBoxVariableValue.Text = "" + variableValueTrigger.expectedValue.ToString("D");
}
}
private void handleHexFormat() {
if (!radioButtonHex.Checked){ return; }
textBoxScriptID.Clear();
textBoxVariableName.Clear();
textBoxVariableValue.Clear();
if (listBoxTriggers.SelectedItem is MapScreenLoadTrigger mapScreenLoadTrigger) {
textBoxScriptID.Text = mapScreenLoadTrigger.scriptTriggered.ToString();
} else if (listBoxTriggers.SelectedItem is VariableValueTrigger variableValueTrigger) {
textBoxScriptID.Text = variableValueTrigger.scriptTriggered.ToString();
textBoxVariableName.Text = "0x" + variableValueTrigger.variableToWatch.ToString("X");
textBoxVariableValue.Text = "0x" + variableValueTrigger.expectedValue.ToString("X");
}
}
private void handleDecimalFormat() {
if (!radioButtonDecimal.Checked){ return; }
textBoxScriptID.Clear();
textBoxVariableName.Clear();
textBoxVariableValue.Clear();
if (listBoxTriggers.SelectedItem is MapScreenLoadTrigger mapScreenLoadTrigger) {
textBoxScriptID.Text = mapScreenLoadTrigger.scriptTriggered.ToString();
} else if (listBoxTriggers.SelectedItem is VariableValueTrigger variableValueTrigger) {
textBoxScriptID.Text = variableValueTrigger.scriptTriggered.ToString();
textBoxVariableName.Text = "" + variableValueTrigger.variableToWatch.ToString("D");
textBoxVariableValue.Text = "" + variableValueTrigger.expectedValue.ToString("D");
}
}
private void radioButtonAuto_CheckedChanged(object sender, EventArgs e) {
handleAutoFormat();
}
private void radioButtonHex_CheckedChanged(object sender, EventArgs e) {
handleHexFormat();
}
private void radioButtonDecimal_CheckedChanged(object sender, EventArgs e) {
handleDecimalFormat();
}
private void AssignGroupBoxScriptText() {
if (radioButtonVariableValue.Checked) {
groupBoxScript.Text = "Keep running this Script";
} else {
groupBoxScript.Text = "Run this Script";
}
}
private void radioButtonVariableValue_CheckedChanged(object sender, EventArgs e) {
groupBoxVariable.Visible = true;
groupBoxValue.Visible = true;
buttonAdd_logic();
AssignGroupBoxScriptText();
}
private void radioButtonMapChange_CheckedChanged(object sender, EventArgs e) {
groupBoxVariable.Visible = false;
groupBoxValue.Visible = false;
buttonAdd_logic();
AssignGroupBoxScriptText();
}
private void radioButtonScreenReset_CheckedChanged(object sender, EventArgs e) {
groupBoxVariable.Visible = false;
groupBoxValue.Visible = false;
buttonAdd_logic();
AssignGroupBoxScriptText();
}
private void radioButtonLoadGame_CheckedChanged(object sender, EventArgs e) {
groupBoxVariable.Visible = false;
groupBoxValue.Visible = false;
buttonAdd_logic();
AssignGroupBoxScriptText();
}
void textBoxScriptID_TextChanged(object sender, EventArgs e) {
buttonAdd_logic();
}
void textBoxVariableName_TextChanged(object sender, EventArgs e) {
buttonAdd_logic();
}
void textBoxVariableValue_TextChanged(object sender, EventArgs e) {
buttonAdd_logic();
}
}
}
================================================
FILE: DS_Map/Editors/LevelScriptEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wAAADsABataJCQAAAGJJREFUOE9j+P//P1bMMEXuHxD/Z5gm+x/ExqYGhLEKgjDYgAUK/8F41AD8BoAV
gkIbAwNDH24AJCawYhSFpGJQFFPBACzOAmMkg/F5AVvAgDBYEm7AaEIi3wBEwsJhwH8GAOQLbolFp0OS
AAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wQAADsEBuJFr7QAAAI5JREFUSEtjGAXkAsOQtP8wDBWiHwBZmrbpJhhDHdACkaExgPkYZjkImydXwLFt
YRdODDWCPIDNYmy4/OJ/rBjqANJDiVKLYZgsB1DDYhimeghgswQfJtsBUNDi0TjvPwhjM5wYTKkDYACr
Q2Bi+DC1HAADYIcgOwAkRiSmHkD2IZBLXcNJALTx3QgCDAwAJg2KYP9PC1YAAAAASUVORK5CYII=
================================================
FILE: DS_Map/Editors/MoveDataEditor.Designer.cs
================================================
namespace DSPRE {
partial class MoveDataEditor {
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MoveDataEditor));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.saveDataButton = new System.Windows.Forms.Button();
this.moveNumberNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.moveNameInputComboBox = new DSPRE.InputComboBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.prioPictureBox = new System.Windows.Forms.PictureBox();
this.contestAppealNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.label6 = new System.Windows.Forms.Label();
this.contestConditionPictureBox = new System.Windows.Forms.PictureBox();
this.contestConditionComboBox = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.moveSplitPictureBox = new System.Windows.Forms.PictureBox();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.flagsTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.checkBox11 = new System.Windows.Forms.CheckBox();
this.checkBox12 = new System.Windows.Forms.CheckBox();
this.checkBox13 = new System.Windows.Forms.CheckBox();
this.checkBox14 = new System.Windows.Forms.CheckBox();
this.checkBox15 = new System.Windows.Forms.CheckBox();
this.checkBox16 = new System.Windows.Forms.CheckBox();
this.checkBox17 = new System.Windows.Forms.CheckBox();
this.moveTypeComboBox = new System.Windows.Forms.ComboBox();
this.battleSeqComboBox = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.typeLabel = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.moveSplitComboBox = new System.Windows.Forms.ComboBox();
this.moveTypePictureBox = new System.Windows.Forms.PictureBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.rangesTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.checkBox20 = new System.Windows.Forms.CheckBox();
this.checkBox19 = new System.Windows.Forms.CheckBox();
this.checkBox2 = new System.Windows.Forms.CheckBox();
this.checkBox3 = new System.Windows.Forms.CheckBox();
this.checkBox4 = new System.Windows.Forms.CheckBox();
this.checkBox5 = new System.Windows.Forms.CheckBox();
this.checkBox6 = new System.Windows.Forms.CheckBox();
this.checkBox7 = new System.Windows.Forms.CheckBox();
this.checkBox8 = new System.Windows.Forms.CheckBox();
this.checkBox9 = new System.Windows.Forms.CheckBox();
this.checkBox10 = new System.Windows.Forms.CheckBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.powerNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.label5 = new System.Windows.Forms.Label();
this.accuracyNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.label7 = new System.Windows.Forms.Label();
this.priorityNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.ppLabel = new System.Windows.Forms.Label();
this.ppUpDown = new System.Windows.Forms.NumericUpDown();
this.label8 = new System.Windows.Forms.Label();
this.sideEffectProbabilityUpDown = new System.Windows.Forms.NumericUpDown();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.moveNumberNumericUpDown)).BeginInit();
this.groupBox3.SuspendLayout();
this.tableLayoutPanel3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.prioPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.contestAppealNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.contestConditionPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.moveSplitPictureBox)).BeginInit();
this.groupBox4.SuspendLayout();
this.flagsTableLayoutPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.moveTypePictureBox)).BeginInit();
this.groupBox1.SuspendLayout();
this.rangesTableLayoutPanel.SuspendLayout();
this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.powerNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.accuracyNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.priorityNumericUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ppUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.sideEffectProbabilityUpDown)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 4;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 57.02703F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 22.3796F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10.43285F));
this.tableLayoutPanel1.Controls.Add(this.saveDataButton, 3, 0);
this.tableLayoutPanel1.Controls.Add(this.moveNumberNumericUpDown, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.moveNameInputComboBox, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.groupBox3, 0, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 5);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 9.036144F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 90.96385F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(740, 557);
this.tableLayoutPanel1.TabIndex = 0;
//
// saveDataButton
//
this.saveDataButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.saveDataButton.Image = ((System.Drawing.Image)(resources.GetObject("saveDataButton.Image")));
this.saveDataButton.Location = new System.Drawing.Point(664, 3);
this.saveDataButton.Name = "saveDataButton";
this.saveDataButton.Size = new System.Drawing.Size(73, 44);
this.saveDataButton.TabIndex = 30;
this.saveDataButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.saveDataButton.UseVisualStyleBackColor = true;
this.saveDataButton.Click += new System.EventHandler(this.saveDataButton_Click);
//
// moveNumberNumericUpDown
//
this.moveNumberNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.moveNumberNumericUpDown.Location = new System.Drawing.Point(499, 15);
this.moveNumberNumericUpDown.Name = "moveNumberNumericUpDown";
this.moveNumberNumericUpDown.Size = new System.Drawing.Size(159, 20);
this.moveNumberNumericUpDown.TabIndex = 16;
this.moveNumberNumericUpDown.ValueChanged += new System.EventHandler(this.moveNumberNumericUpDown_ValueChanged);
//
// moveNameInputComboBox
//
this.moveNameInputComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.moveNameInputComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.moveNameInputComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.moveNameInputComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.moveNameInputComboBox.FormattingEnabled = true;
this.moveNameInputComboBox.Location = new System.Drawing.Point(77, 14);
this.moveNameInputComboBox.Name = "moveNameInputComboBox";
this.moveNameInputComboBox.Size = new System.Drawing.Size(416, 32);
this.moveNameInputComboBox.TabIndex = 31;
this.moveNameInputComboBox.SelectedIndexChanged += new System.EventHandler(this.moveNameInputComboBox_SelectedIndexChanged);
//
// groupBox3
//
this.tableLayoutPanel1.SetColumnSpan(this.groupBox3, 4);
this.groupBox3.Controls.Add(this.tableLayoutPanel3);
this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox3.Location = new System.Drawing.Point(3, 53);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
this.groupBox3.Size = new System.Drawing.Size(734, 501);
this.groupBox3.TabIndex = 33;
this.groupBox3.TabStop = false;
//
// tableLayoutPanel3
//
this.tableLayoutPanel3.ColumnCount = 7;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25.22124F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 53.9823F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.91647F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 67F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 252F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 69F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 109F));
this.tableLayoutPanel3.Controls.Add(this.prioPictureBox, 2, 3);
this.tableLayoutPanel3.Controls.Add(this.contestAppealNumericUpDown, 4, 2);
this.tableLayoutPanel3.Controls.Add(this.label6, 3, 2);
this.tableLayoutPanel3.Controls.Add(this.contestConditionPictureBox, 2, 2);
this.tableLayoutPanel3.Controls.Add(this.contestConditionComboBox, 1, 2);
this.tableLayoutPanel3.Controls.Add(this.label3, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.moveSplitPictureBox, 2, 1);
this.tableLayoutPanel3.Controls.Add(this.groupBox4, 4, 4);
this.tableLayoutPanel3.Controls.Add(this.moveTypeComboBox, 1, 0);
this.tableLayoutPanel3.Controls.Add(this.battleSeqComboBox, 4, 0);
this.tableLayoutPanel3.Controls.Add(this.label1, 3, 0);
this.tableLayoutPanel3.Controls.Add(this.typeLabel, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel3.Controls.Add(this.moveSplitComboBox, 1, 1);
this.tableLayoutPanel3.Controls.Add(this.moveTypePictureBox, 2, 0);
this.tableLayoutPanel3.Controls.Add(this.groupBox1, 3, 4);
this.tableLayoutPanel3.Controls.Add(this.groupBox2, 0, 4);
this.tableLayoutPanel3.Controls.Add(this.label4, 5, 0);
this.tableLayoutPanel3.Controls.Add(this.powerNumericUpDown, 6, 0);
this.tableLayoutPanel3.Controls.Add(this.label5, 5, 1);
this.tableLayoutPanel3.Controls.Add(this.accuracyNumericUpDown, 6, 1);
this.tableLayoutPanel3.Controls.Add(this.label7, 0, 3);
this.tableLayoutPanel3.Controls.Add(this.priorityNumericUpDown, 1, 3);
this.tableLayoutPanel3.Controls.Add(this.ppLabel, 3, 1);
this.tableLayoutPanel3.Controls.Add(this.ppUpDown, 4, 1);
this.tableLayoutPanel3.Controls.Add(this.label8, 3, 3);
this.tableLayoutPanel3.Controls.Add(this.sideEffectProbabilityUpDown, 4, 3);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 13);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.Padding = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.RowCount = 8;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 8.996453F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 8.282195F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 7.637531F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 8.035714F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 29.6875F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 5.275226F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 31.87116F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(728, 488);
this.tableLayoutPanel3.TabIndex = 32;
//
// prioPictureBox
//
this.prioPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.prioPictureBox.Location = new System.Drawing.Point(184, 119);
this.prioPictureBox.Name = "prioPictureBox";
this.prioPictureBox.Size = new System.Drawing.Size(41, 31);
this.prioPictureBox.TabIndex = 27;
this.prioPictureBox.TabStop = false;
//
// contestAppealNumericUpDown
//
this.contestAppealNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.contestAppealNumericUpDown.Location = new System.Drawing.Point(298, 88);
this.contestAppealNumericUpDown.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.contestAppealNumericUpDown.Name = "contestAppealNumericUpDown";
this.contestAppealNumericUpDown.Size = new System.Drawing.Size(246, 20);
this.contestAppealNumericUpDown.TabIndex = 24;
this.contestAppealNumericUpDown.ValueChanged += new System.EventHandler(this.contestAppealNumericUpDown_ValueChanged);
//
// label6
//
this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(231, 85);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(61, 26);
this.label6.TabIndex = 23;
this.label6.Text = "Contest Appeal";
this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// contestConditionPictureBox
//
this.contestConditionPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.contestConditionPictureBox.Location = new System.Drawing.Point(184, 84);
this.contestConditionPictureBox.Name = "contestConditionPictureBox";
this.contestConditionPictureBox.Size = new System.Drawing.Size(41, 29);
this.contestConditionPictureBox.TabIndex = 22;
this.contestConditionPictureBox.TabStop = false;
//
// contestConditionComboBox
//
this.contestConditionComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.contestConditionComboBox.FormattingEnabled = true;
this.contestConditionComboBox.Location = new System.Drawing.Point(62, 88);
this.contestConditionComboBox.Name = "contestConditionComboBox";
this.contestConditionComboBox.Size = new System.Drawing.Size(116, 21);
this.contestConditionComboBox.TabIndex = 21;
this.contestConditionComboBox.SelectedIndexChanged += new System.EventHandler(this.contestConditionComboBox_SelectedIndexChanged);
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(5, 85);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(51, 26);
this.label3.TabIndex = 20;
this.label3.Text = "Contest\r\nCondition";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// moveSplitPictureBox
//
this.moveSplitPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.moveSplitPictureBox.Location = new System.Drawing.Point(184, 46);
this.moveSplitPictureBox.Name = "moveSplitPictureBox";
this.moveSplitPictureBox.Size = new System.Drawing.Size(41, 32);
this.moveSplitPictureBox.TabIndex = 19;
this.moveSplitPictureBox.TabStop = false;
//
// groupBox4
//
this.tableLayoutPanel3.SetColumnSpan(this.groupBox4, 4);
this.groupBox4.Controls.Add(this.flagsTableLayoutPanel);
this.groupBox4.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox4.Location = new System.Drawing.Point(231, 318);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(492, 142);
this.groupBox4.TabIndex = 18;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Flags";
//
// flagsTableLayoutPanel
//
this.flagsTableLayoutPanel.ColumnCount = 3;
this.flagsTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.flagsTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.flagsTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.flagsTableLayoutPanel.Controls.Add(this.checkBox1, 0, 0);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox11, 1, 0);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox12, 2, 0);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox13, 0, 1);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox14, 1, 1);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox15, 2, 1);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox16, 0, 2);
this.flagsTableLayoutPanel.Controls.Add(this.checkBox17, 1, 2);
this.flagsTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.flagsTableLayoutPanel.Location = new System.Drawing.Point(3, 16);
this.flagsTableLayoutPanel.Name = "flagsTableLayoutPanel";
this.flagsTableLayoutPanel.RowCount = 3;
this.flagsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.flagsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.flagsTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.flagsTableLayoutPanel.Size = new System.Drawing.Size(486, 123);
this.flagsTableLayoutPanel.TabIndex = 11;
//
// checkBox1
//
this.checkBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox1.Location = new System.Drawing.Point(3, 3);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(155, 35);
this.checkBox1.TabIndex = 1;
this.checkBox1.Text = "checkBox1";
this.checkBox1.UseVisualStyleBackColor = true;
//
// checkBox11
//
this.checkBox11.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox11.Location = new System.Drawing.Point(164, 3);
this.checkBox11.Name = "checkBox11";
this.checkBox11.Size = new System.Drawing.Size(156, 35);
this.checkBox11.TabIndex = 2;
this.checkBox11.Text = "checkBox11";
this.checkBox11.UseVisualStyleBackColor = true;
//
// checkBox12
//
this.checkBox12.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox12.Location = new System.Drawing.Point(326, 3);
this.checkBox12.Name = "checkBox12";
this.checkBox12.Size = new System.Drawing.Size(157, 35);
this.checkBox12.TabIndex = 3;
this.checkBox12.Text = "checkBox12";
this.checkBox12.UseVisualStyleBackColor = true;
//
// checkBox13
//
this.checkBox13.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox13.Location = new System.Drawing.Point(3, 44);
this.checkBox13.Name = "checkBox13";
this.checkBox13.Size = new System.Drawing.Size(155, 35);
this.checkBox13.TabIndex = 4;
this.checkBox13.Text = "checkBox13";
this.checkBox13.UseVisualStyleBackColor = true;
//
// checkBox14
//
this.checkBox14.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox14.Location = new System.Drawing.Point(164, 44);
this.checkBox14.Name = "checkBox14";
this.checkBox14.Size = new System.Drawing.Size(156, 35);
this.checkBox14.TabIndex = 5;
this.checkBox14.Text = "checkBox14";
this.checkBox14.UseVisualStyleBackColor = true;
//
// checkBox15
//
this.checkBox15.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox15.Location = new System.Drawing.Point(326, 44);
this.checkBox15.Name = "checkBox15";
this.checkBox15.Size = new System.Drawing.Size(157, 35);
this.checkBox15.TabIndex = 6;
this.checkBox15.Text = "checkBox15";
this.checkBox15.UseVisualStyleBackColor = true;
//
// checkBox16
//
this.checkBox16.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox16.Location = new System.Drawing.Point(3, 85);
this.checkBox16.Name = "checkBox16";
this.checkBox16.Size = new System.Drawing.Size(155, 35);
this.checkBox16.TabIndex = 7;
this.checkBox16.Text = "checkBox16";
this.checkBox16.UseVisualStyleBackColor = true;
//
// checkBox17
//
this.checkBox17.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox17.Location = new System.Drawing.Point(164, 85);
this.checkBox17.Name = "checkBox17";
this.checkBox17.Size = new System.Drawing.Size(156, 35);
this.checkBox17.TabIndex = 8;
this.checkBox17.Text = "checkBox17";
this.checkBox17.UseVisualStyleBackColor = true;
//
// moveTypeComboBox
//
this.moveTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.moveTypeComboBox.FormattingEnabled = true;
this.moveTypeComboBox.Location = new System.Drawing.Point(62, 12);
this.moveTypeComboBox.Name = "moveTypeComboBox";
this.moveTypeComboBox.Size = new System.Drawing.Size(116, 21);
this.moveTypeComboBox.TabIndex = 7;
this.moveTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.moveTypeComboBox_SelectedIndexChanged);
//
// battleSeqComboBox
//
this.battleSeqComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.battleSeqComboBox.FormattingEnabled = true;
this.battleSeqComboBox.Location = new System.Drawing.Point(298, 12);
this.battleSeqComboBox.Name = "battleSeqComboBox";
this.battleSeqComboBox.Size = new System.Drawing.Size(246, 21);
this.battleSeqComboBox.TabIndex = 0;
this.battleSeqComboBox.SelectedIndexChanged += new System.EventHandler(this.battleSeqComboBox_SelectedIndexChanged);
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(231, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(61, 26);
this.label1.TabIndex = 1;
this.label1.Text = "Effect Sequence";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// typeLabel
//
this.typeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.typeLabel.AutoSize = true;
this.typeLabel.Location = new System.Drawing.Point(5, 16);
this.typeLabel.Name = "typeLabel";
this.typeLabel.Size = new System.Drawing.Size(51, 13);
this.typeLabel.TabIndex = 2;
this.typeLabel.Text = "Type";
this.typeLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(5, 55);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(51, 13);
this.label2.TabIndex = 5;
this.label2.Text = "Split";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// moveSplitComboBox
//
this.moveSplitComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.moveSplitComboBox.FormattingEnabled = true;
this.moveSplitComboBox.Location = new System.Drawing.Point(62, 51);
this.moveSplitComboBox.Name = "moveSplitComboBox";
this.moveSplitComboBox.Size = new System.Drawing.Size(116, 21);
this.moveSplitComboBox.TabIndex = 6;
this.moveSplitComboBox.SelectedIndexChanged += new System.EventHandler(this.moveSplitComboBox_SelectedIndexChanged);
//
// moveTypePictureBox
//
this.moveTypePictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.moveTypePictureBox.Location = new System.Drawing.Point(184, 5);
this.moveTypePictureBox.Name = "moveTypePictureBox";
this.moveTypePictureBox.Size = new System.Drawing.Size(41, 35);
this.moveTypePictureBox.TabIndex = 3;
this.moveTypePictureBox.TabStop = false;
//
// groupBox1
//
this.tableLayoutPanel3.SetColumnSpan(this.groupBox1, 4);
this.groupBox1.Controls.Add(this.rangesTableLayoutPanel);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Location = new System.Drawing.Point(231, 156);
this.groupBox1.Name = "groupBox1";
this.tableLayoutPanel3.SetRowSpan(this.groupBox1, 2);
this.groupBox1.Size = new System.Drawing.Size(492, 156);
this.groupBox1.TabIndex = 12;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Range of action";
//
// rangesTableLayoutPanel
//
this.rangesTableLayoutPanel.ColumnCount = 3;
this.rangesTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33332F));
this.rangesTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.rangesTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33334F));
this.rangesTableLayoutPanel.Controls.Add(this.checkBox20, 1, 3);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox19, 0, 3);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox2, 0, 0);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox3, 1, 0);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox4, 2, 0);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox5, 0, 1);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox6, 1, 1);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox7, 2, 1);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox8, 0, 2);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox9, 1, 2);
this.rangesTableLayoutPanel.Controls.Add(this.checkBox10, 2, 2);
this.rangesTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.rangesTableLayoutPanel.Location = new System.Drawing.Point(3, 16);
this.rangesTableLayoutPanel.Name = "rangesTableLayoutPanel";
this.rangesTableLayoutPanel.RowCount = 4;
this.rangesTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.rangesTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.rangesTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.rangesTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.rangesTableLayoutPanel.Size = new System.Drawing.Size(486, 137);
this.rangesTableLayoutPanel.TabIndex = 11;
//
// checkBox20
//
this.checkBox20.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox20.Location = new System.Drawing.Point(164, 105);
this.checkBox20.Name = "checkBox20";
this.checkBox20.Size = new System.Drawing.Size(156, 29);
this.checkBox20.TabIndex = 11;
this.checkBox20.Text = "checkBox20";
this.checkBox20.UseVisualStyleBackColor = true;
//
// checkBox19
//
this.checkBox19.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox19.Location = new System.Drawing.Point(3, 105);
this.checkBox19.Name = "checkBox19";
this.checkBox19.Size = new System.Drawing.Size(155, 29);
this.checkBox19.TabIndex = 10;
this.checkBox19.Text = "checkBox19";
this.checkBox19.UseVisualStyleBackColor = true;
//
// checkBox2
//
this.checkBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox2.Location = new System.Drawing.Point(3, 3);
this.checkBox2.Name = "checkBox2";
this.checkBox2.Size = new System.Drawing.Size(155, 28);
this.checkBox2.TabIndex = 1;
this.checkBox2.Text = "checkBox2";
this.checkBox2.UseVisualStyleBackColor = true;
//
// checkBox3
//
this.checkBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox3.Location = new System.Drawing.Point(164, 3);
this.checkBox3.Name = "checkBox3";
this.checkBox3.Size = new System.Drawing.Size(156, 28);
this.checkBox3.TabIndex = 2;
this.checkBox3.Text = "checkBox3";
this.checkBox3.UseVisualStyleBackColor = true;
//
// checkBox4
//
this.checkBox4.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox4.Location = new System.Drawing.Point(326, 3);
this.checkBox4.Name = "checkBox4";
this.checkBox4.Size = new System.Drawing.Size(157, 28);
this.checkBox4.TabIndex = 3;
this.checkBox4.Text = "checkBox4";
this.checkBox4.UseVisualStyleBackColor = true;
//
// checkBox5
//
this.checkBox5.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox5.Location = new System.Drawing.Point(3, 37);
this.checkBox5.Name = "checkBox5";
this.checkBox5.Size = new System.Drawing.Size(155, 28);
this.checkBox5.TabIndex = 4;
this.checkBox5.Text = "checkBox5";
this.checkBox5.UseVisualStyleBackColor = true;
//
// checkBox6
//
this.checkBox6.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox6.Location = new System.Drawing.Point(164, 37);
this.checkBox6.Name = "checkBox6";
this.checkBox6.Size = new System.Drawing.Size(156, 28);
this.checkBox6.TabIndex = 5;
this.checkBox6.Text = "checkBox6";
this.checkBox6.UseVisualStyleBackColor = true;
//
// checkBox7
//
this.checkBox7.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox7.Location = new System.Drawing.Point(326, 37);
this.checkBox7.Name = "checkBox7";
this.checkBox7.Size = new System.Drawing.Size(157, 28);
this.checkBox7.TabIndex = 6;
this.checkBox7.Text = "checkBox7";
this.checkBox7.UseVisualStyleBackColor = true;
//
// checkBox8
//
this.checkBox8.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox8.Location = new System.Drawing.Point(3, 71);
this.checkBox8.Name = "checkBox8";
this.checkBox8.Size = new System.Drawing.Size(155, 28);
this.checkBox8.TabIndex = 7;
this.checkBox8.Text = "checkBox8";
this.checkBox8.UseVisualStyleBackColor = true;
//
// checkBox9
//
this.checkBox9.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox9.Location = new System.Drawing.Point(164, 71);
this.checkBox9.Name = "checkBox9";
this.checkBox9.Size = new System.Drawing.Size(156, 28);
this.checkBox9.TabIndex = 8;
this.checkBox9.Text = "checkBox9";
this.checkBox9.UseVisualStyleBackColor = true;
//
// checkBox10
//
this.checkBox10.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkBox10.Location = new System.Drawing.Point(326, 71);
this.checkBox10.Name = "checkBox10";
this.checkBox10.Size = new System.Drawing.Size(157, 28);
this.checkBox10.TabIndex = 9;
this.checkBox10.Text = "checkBox10";
this.checkBox10.UseVisualStyleBackColor = true;
//
// groupBox2
//
this.tableLayoutPanel3.SetColumnSpan(this.groupBox2, 3);
this.groupBox2.Controls.Add(this.textBox1);
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(5, 156);
this.groupBox2.Name = "groupBox2";
this.tableLayoutPanel3.SetRowSpan(this.groupBox2, 3);
this.groupBox2.Size = new System.Drawing.Size(220, 304);
this.groupBox2.TabIndex = 17;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Description";
//
// textBox1
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox1.Font = new System.Drawing.Font("Pokemon DPPt", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBox1.Location = new System.Drawing.Point(3, 16);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ReadOnly = true;
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.textBox1.Size = new System.Drawing.Size(214, 285);
this.textBox1.TabIndex = 0;
//
// label4
//
this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(550, 16);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(63, 13);
this.label4.TabIndex = 13;
this.label4.Text = "Power";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// powerNumericUpDown
//
this.powerNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.powerNumericUpDown.Location = new System.Drawing.Point(619, 12);
this.powerNumericUpDown.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.powerNumericUpDown.Name = "powerNumericUpDown";
this.powerNumericUpDown.Size = new System.Drawing.Size(104, 20);
this.powerNumericUpDown.TabIndex = 14;
this.powerNumericUpDown.ValueChanged += new System.EventHandler(this.powerNumericUpDown_ValueChanged);
//
// label5
//
this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(550, 55);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(63, 13);
this.label5.TabIndex = 15;
this.label5.Text = "Accuracy";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// accuracyNumericUpDown
//
this.accuracyNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.accuracyNumericUpDown.Location = new System.Drawing.Point(619, 52);
this.accuracyNumericUpDown.Name = "accuracyNumericUpDown";
this.accuracyNumericUpDown.Size = new System.Drawing.Size(104, 20);
this.accuracyNumericUpDown.TabIndex = 16;
this.accuracyNumericUpDown.ValueChanged += new System.EventHandler(this.accuracyNumericUpDown_ValueChanged);
//
// label7
//
this.label7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(5, 128);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(51, 13);
this.label7.TabIndex = 25;
this.label7.Text = "Priority";
this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// priorityNumericUpDown
//
this.priorityNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.priorityNumericUpDown.Location = new System.Drawing.Point(62, 124);
this.priorityNumericUpDown.Maximum = new decimal(new int[] {
32,
0,
0,
0});
this.priorityNumericUpDown.Minimum = new decimal(new int[] {
32,
0,
0,
-2147483648});
this.priorityNumericUpDown.Name = "priorityNumericUpDown";
this.priorityNumericUpDown.Size = new System.Drawing.Size(116, 20);
this.priorityNumericUpDown.TabIndex = 26;
this.priorityNumericUpDown.ValueChanged += new System.EventHandler(this.priorityNumericUpDown_ValueChanged);
//
// ppLabel
//
this.ppLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.ppLabel.AutoSize = true;
this.ppLabel.Location = new System.Drawing.Point(231, 55);
this.ppLabel.Name = "ppLabel";
this.ppLabel.Size = new System.Drawing.Size(61, 13);
this.ppLabel.TabIndex = 4;
this.ppLabel.Text = "PP";
this.ppLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// ppUpDown
//
this.ppUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.ppUpDown.Location = new System.Drawing.Point(298, 52);
this.ppUpDown.Name = "ppUpDown";
this.ppUpDown.Size = new System.Drawing.Size(246, 20);
this.ppUpDown.TabIndex = 8;
this.ppUpDown.ValueChanged += new System.EventHandler(this.ppUpDown_ValueChanged);
//
// label8
//
this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(231, 121);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(61, 26);
this.label8.TabIndex = 28;
this.label8.Text = "Side Effect Probability";
this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// sideEffectProbabilityUpDown
//
this.sideEffectProbabilityUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.sideEffectProbabilityUpDown.Location = new System.Drawing.Point(298, 124);
this.sideEffectProbabilityUpDown.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.sideEffectProbabilityUpDown.Name = "sideEffectProbabilityUpDown";
this.sideEffectProbabilityUpDown.Size = new System.Drawing.Size(246, 20);
this.sideEffectProbabilityUpDown.TabIndex = 29;
this.sideEffectProbabilityUpDown.ValueChanged += new System.EventHandler(this.sideEffectUpDown_ValueChanged);
//
// MoveDataEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(750, 567);
this.Controls.Add(this.tableLayoutPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "MoveDataEditor";
this.Padding = new System.Windows.Forms.Padding(5);
this.Text = "Move Data Editor";
this.tableLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.moveNumberNumericUpDown)).EndInit();
this.groupBox3.ResumeLayout(false);
this.tableLayoutPanel3.ResumeLayout(false);
this.tableLayoutPanel3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.prioPictureBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.contestAppealNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.contestConditionPictureBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.moveSplitPictureBox)).EndInit();
this.groupBox4.ResumeLayout(false);
this.flagsTableLayoutPanel.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.moveTypePictureBox)).EndInit();
this.groupBox1.ResumeLayout(false);
this.rangesTableLayoutPanel.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.powerNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.accuracyNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.priorityNumericUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ppUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.sideEffectProbabilityUpDown)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.NumericUpDown moveNumberNumericUpDown;
private System.Windows.Forms.Button saveDataButton;
private InputComboBox moveNameInputComboBox;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.ComboBox battleSeqComboBox;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label typeLabel;
private System.Windows.Forms.PictureBox moveTypePictureBox;
private System.Windows.Forms.Label ppLabel;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox moveSplitComboBox;
private System.Windows.Forms.ComboBox moveTypeComboBox;
private System.Windows.Forms.NumericUpDown ppUpDown;
private System.Windows.Forms.CheckBox checkBox2;
private System.Windows.Forms.CheckBox checkBox3;
private System.Windows.Forms.CheckBox checkBox4;
private System.Windows.Forms.CheckBox checkBox5;
private System.Windows.Forms.CheckBox checkBox6;
private System.Windows.Forms.CheckBox checkBox7;
private System.Windows.Forms.CheckBox checkBox8;
private System.Windows.Forms.CheckBox checkBox9;
private System.Windows.Forms.CheckBox checkBox10;
private System.Windows.Forms.TableLayoutPanel rangesTableLayoutPanel;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.NumericUpDown powerNumericUpDown;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.NumericUpDown accuracyNumericUpDown;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.TableLayoutPanel flagsTableLayoutPanel;
private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.CheckBox checkBox11;
private System.Windows.Forms.CheckBox checkBox12;
private System.Windows.Forms.CheckBox checkBox13;
private System.Windows.Forms.CheckBox checkBox14;
private System.Windows.Forms.CheckBox checkBox15;
private System.Windows.Forms.CheckBox checkBox16;
private System.Windows.Forms.CheckBox checkBox17;
private System.Windows.Forms.CheckBox checkBox20;
private System.Windows.Forms.CheckBox checkBox19;
private System.Windows.Forms.PictureBox moveSplitPictureBox;
private System.Windows.Forms.NumericUpDown contestAppealNumericUpDown;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.PictureBox contestConditionPictureBox;
private System.Windows.Forms.ComboBox contestConditionComboBox;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.NumericUpDown priorityNumericUpDown;
private System.Windows.Forms.PictureBox prioPictureBox;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.NumericUpDown sideEffectProbabilityUpDown;
}
}
================================================
FILE: DS_Map/Editors/MoveDataEditor.cs
================================================
using DSPRE.Resources;
using DSPRE.ROMFiles;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using static DSPRE.MoveData;
using MessageBox = System.Windows.Forms.MessageBox;
namespace DSPRE {
public partial class MoveDataEditor : Form {
private bool disableHandlers = false;
private readonly string[] fileNames;
private readonly string[] moveDescriptions;
private int currentLoadedId = 0;
private MoveData currentLoadedFile = null;
private static bool dirty = false;
private static readonly string formName = "Move Data Editor";
public MoveDataEditor(string[] fileNames, string[] moveDescriptions) {
this.fileNames = fileNames.ToArray();
this.moveDescriptions = moveDescriptions;
InitializeComponent();
disableHandlers = true;
moveNumberNumericUpDown.Maximum = fileNames.Length - 1;
moveNameInputComboBox.Items.AddRange(this.fileNames);
string[] battleSequenceFiles = RomInfo.GetBattleEffectSequenceFiles();
for (int i = 0; i < battleSequenceFiles.Length; i++) {
string[] db = PokeDatabase.MoveData.battleSequenceDescriptions;
if (i >= db.Length || db[i] is null) {
battleSeqComboBox.Items.Add($"{i:D3} - Undocumented");
} else {
battleSeqComboBox.Items.Add(db[i]);
}
}
moveSplitComboBox.Items.AddRange(Enum.GetNames(typeof(MoveData.MoveSplit)));
string[] names = Enum.GetNames(typeof(MoveData.AttackRange));
System.Collections.IList list = rangesTableLayoutPanel.Controls;
for (int i = 0; i < list.Count; i++) {
CheckBox cb = list[i] as CheckBox;
cb.Text = names[i + 1];
cb.CheckedChanged += AttackRangeCheckBox_CheckedChanged;
}
names = Enum.GetNames(typeof(MoveData.MoveFlags));
list = flagsTableLayoutPanel.Controls;
for (int i = 0; i < list.Count; i++) {
CheckBox cb = list[i] as CheckBox;
cb.Text = names[i];
cb.CheckedChanged += FlagsCheckBox_CheckedChanged;
}
contestConditionComboBox.Items.AddRange(Enum.GetNames(typeof(MoveData.ContestCondition)));
moveTypeComboBox.Items.AddRange(Enum.GetNames(typeof(PokemonType)));
disableHandlers = false;
moveNameInputComboBox.SelectedIndex = 1;
}
private void setDirty(bool status) {
if (status) {
dirty = true;
this.Text = formName + "*";
} else {
dirty = false;
this.Text = formName;
}
}
private bool CheckDiscardChanges() {
if (!dirty) {
return true;
}
DialogResult res = MessageBox.Show(this, "There are unsaved changes to the current Move data.\nDiscard and proceed?", "Unsaved changes", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (res.Equals(DialogResult.Yes)) {
return true;
}
moveNumberNumericUpDown.Value = currentLoadedId;
moveNameInputComboBox.SelectedIndex = currentLoadedId;
return false;
}
private void ChangeLoadedFile(int toLoad) {
currentLoadedId = toLoad;
currentLoadedFile = new MoveData(toLoad);
PopulateAllFromCurrentFile();
setDirty(false);
}
private void PopulateAllFromCurrentFile() {
moveTypeComboBox.SelectedIndex = (int)currentLoadedFile.movetype;
System.Collections.IList list = rangesTableLayoutPanel.Controls;
for (int i = 0; i < list.Count; i++) {
(list[i] as CheckBox).Checked = ((currentLoadedFile.target & (1 << i)) != 0);
}
list = flagsTableLayoutPanel.Controls;
for (int i = 0; i < list.Count; i++) {
(list[i] as CheckBox).Checked = ((currentLoadedFile.flagField & (1 << i)) != 0);
}
textBox1.Text = moveDescriptions[currentLoadedId];
battleSeqComboBox.SelectedIndex = (int)currentLoadedFile.battleeffect;
moveSplitComboBox.SelectedIndex = (int)currentLoadedFile.split;
sideEffectProbabilityUpDown.Value = currentLoadedFile.sideEffectProbability;
contestConditionComboBox.SelectedIndex = (int)currentLoadedFile.contestConditionType;
contestAppealNumericUpDown.Value = currentLoadedFile.contestAppeal;
priorityNumericUpDown.Value = currentLoadedFile.priority;
powerNumericUpDown.Value = currentLoadedFile.damage;
accuracyNumericUpDown.Value = currentLoadedFile.accuracy;
ppUpDown.Value = currentLoadedFile.pp;
}
//-------------------------------
private void saveDataButton_Click(object sender, EventArgs e) {
currentLoadedFile.SaveToFileDefaultDir(currentLoadedId, true);
setDirty(false);
}
private void FlagsCheckBox_CheckedChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
disableHandlers = true;
System.Collections.IList list = flagsTableLayoutPanel.Controls;
currentLoadedFile.flagField = 0;
for (int i = 0; i < list.Count; i++) {
int en = (list[i] as CheckBox).Checked ? 1 : 0;
currentLoadedFile.flagField |= (byte)(en << i);
}
setDirty(true);
disableHandlers = false;
}
private void AttackRangeCheckBox_CheckedChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
disableHandlers = true;
System.Collections.IList list = rangesTableLayoutPanel.Controls;
currentLoadedFile.target = 0;
for (int i = 0; i < list.Count; i++) {
int en = (list[i] as CheckBox).Checked ? 1 : 0;
currentLoadedFile.target |= (ushort)(en << i);
}
setDirty(true);
disableHandlers = false;
}
private void moveNameInputComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
disableHandlers = true;
if (CheckDiscardChanges()) {
int newNumber = moveNameInputComboBox.SelectedIndex;
moveNumberNumericUpDown.Value = newNumber;
ChangeLoadedFile(newNumber);
}
disableHandlers = false;
}
private void moveNumberNumericUpDown_ValueChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
disableHandlers = true;
if (CheckDiscardChanges()) {
int newNumber = (int)moveNumberNumericUpDown.Value;
moveNameInputComboBox.SelectedIndex = newNumber;
ChangeLoadedFile(newNumber);
}
disableHandlers = false;
}
private void saveToFileToolStripMenuItem_Click(object sender, EventArgs e) {
string suggestedFilename = this.fileNames[currentLoadedId];
currentLoadedFile.SaveToFileExplorePath(suggestedFilename, true);
}
private void ppUpDown_ValueChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.pp = (byte)ppUpDown.Value;
setDirty(true);
}
private void moveSplitComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.split = (MoveSplit)moveSplitComboBox.SelectedIndex;
setDirty(true);
}
private void moveTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.movetype = (PokemonType)moveTypeComboBox.SelectedIndex;
setDirty(true);
}
private void battleSeqComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.battleeffect = (ushort)battleSeqComboBox.SelectedIndex;
setDirty(true);
}
private void contestConditionComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.contestConditionType = (ContestCondition)contestConditionComboBox.SelectedIndex;
setDirty(true);
}
private void contestAppealNumericUpDown_ValueChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.contestAppeal = (byte)contestAppealNumericUpDown.Value;
setDirty(true);
}
private void powerNumericUpDown_ValueChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.damage = (byte)powerNumericUpDown.Value;
setDirty(true);
}
private void accuracyNumericUpDown_ValueChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.accuracy = (byte)accuracyNumericUpDown.Value;
setDirty(true);
}
private void priorityNumericUpDown_ValueChanged(object sender, EventArgs e) {
if (currentLoadedFile.priority == 0) {
prioPictureBox.Image = null;
} else if (currentLoadedFile.priority > 0) {
prioPictureBox.Image = Properties.Resources.addIcon;
} else {
prioPictureBox.Image = Properties.Resources.deleteIcon;
}
if (disableHandlers) {
return;
}
currentLoadedFile.priority = (sbyte)priorityNumericUpDown.Value;
setDirty(true);
}
private void sideEffectUpDown_ValueChanged(object sender, EventArgs e) {
if (disableHandlers) {
return;
}
currentLoadedFile.sideEffectProbability = (byte)sideEffectProbabilityUpDown.Value;
setDirty(true);
}
}
}
================================================
FILE: DS_Map/Editors/MoveDataEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAacSURBVFhHxZd5bFRVGMX5Aw24VmtbI4lGoyHGYPSP
mqgoEQg0SqELbVEiGiWAqIS1lha6sdTK0oWyiAYQTBVQBEqrgEaIghAKDaC1te1M91k7nZnXmS4z0+N3
7rQDtTMmNia85Mx777v3/s5533uzjQJwS+V/8W+3ReVUmMOzK3B/VjnCMstx19py3LGmHGNHKK4lgywy
yY7MKjsqXqP9lrINBKC5Jfu8A1VWH65YfDhv9MrQ/7ORRSbZ9Ihce7RMPP0hZJy7MKarsfkwOr8WYzfX
YdTGGlitHdC1W1DfNjJxLRlkkUk2PeglnnfTeDBAJFt01epFWKEOY+IyMHarDna7DY0mCWEUmWz+vahB
yRo4D1bjeaPJqhhkkUk2PeglnhE0vilABSpNHkSVNOKe2Zm4t6gRmtOBVqsDbZ1utDu60Wp3o8XmQnNH
l0hDa6dLFKzGcw0tFjucDodikUk2PehFTxrfCCBtOdfWi3Hb9Xhw+UGEF+uhaU4Y7C6kzE7E6ynJ2Lm9
BNu3FWNbUQEMjh4kJcZjR8m2ILViFBcWoM2myUU4FYtMsulBL3rSOBCA9+VMcy8e2dGAJz7VI6q4Hq6u
LhXA1NUHs9ur9gatVxmxI0Y5NmpSc/prBqmZ5Jx1jrfbuhSDLDLJpsfAMzA8wOnGHjy+swFP7tZhXIkE
cLlhFJDZ5YW1G7L3SQgvjF2eG3L6A3COxd0fmKNCye0hgywyyaZH0AAPSPFEQ4+aOOFznUrb090Nq6sP
ydLWOclJ/nYXF6EkoEIUF2yVcP0yJyEwh/Wigi0waz3oFgZZZJJND3rRk8ZDAhyrd8tEPZ7Zo8dju3To
6emFRdre0QPY+qD2NGM3/OqHRa6YV//POayZpQtkkEUm2fQIGeBwrRvP7tUjep8e43c3oK/Pgw65950C
pgjvEGO7HDvkc2qwRkMes869rXcgoMujGGSRSTY9ggfIqUBptQvPfdGE5/c34ilpmcfjhV1giXEzA211
eICkhHikJCXK01+kanapJcbPGrg9heodUbhlM2zdPsUgi0yy6UEvetI4ECBCivv/cOHFA8146csm1TKv
V65s4OoGr8wmV8wQTukAjVljF1QH5DwwV2o2eSg9nn7FIpNsetCLnjQeEmDv7xomlbZgsiha0nKT24hO
GlDSVpsocB6qNlB3yp4bWWSSTY+QAT67qmHqVy2Y/rVMlsSndG4F8PWPTNzIIItMsukRMsAuGYw52IrX
DrXi1YMtmFLajJdl8cQDIxPXkkEWmWTTI2SA7VUaYg+3Ie7bNsSLZn3ThplyPuNw64jEtWSQRSbZ9AgZ
oPiKhoQj7Zj9XTuSRDyOFUDMoTZMk/T/RVzDtWSQRSaP6RE0QKQUCyo1JB81YM4xv+KPGFBaaQC88lj3
iTzymHvl8ad4zFooyRquJWOQRzY96EVPGg8JsPWShrnHDXizzKD2cZIYXg+u1ptwVdeB6hYNfxm7lapb
nKpWVW8WmYaqTubLHj6PYtzMpEfIAJsuOTGv3Ii3RPNOGJEgbePVXtfZYJKPvozsPEybOhnTpryC9Mx1
qnZd34lrMn5df0M8vybhuJYMshRTRI+QAT655MC735swX/ROhQnJ0jZCqpsd4Fs6ZnoMlqXlinKwcEka
5INOjVU324erqVOtJYMsMsmmR8gAH1/UsPCkBYtOmrHgBzPeKDNKG72oadUgdxyxM2Kxam0eVq7ZgPeX
r0WvvNc5VtPqHK4Wh6z1KQZZZJJNj5ABNl504IPTZqXFp8yqZej3oU7uOX8jx8XFIy07Hx9l5mPJqmzI
o6bG6gyuoOJaMsga5NIjZIANMrj0J6vIgiU/WlTLhAKduVde5QsncTYy1m1Ges4mLF+dq0JxTGfqHi4J
xrVkkEUm2fT4lwAaUs/akHqmAyt+tmLRKYsMQ350elSApOQUrFm/BWskxMqM9ZBHAM0y1tTRN1TWPjRb
5UtENjLIIpNsegQNEJVV1pl/2Y11FzTk/uaUPxBOrDhrVxCTpnZISExEWmYeVmflITU9V9WMTshvweEy
ibiRQRaZZNMjYuWBs+I55Gd5mCg6KvO4nemo8Oxy3J5ehmvXanHu8p/45XIN3p6/4L2lq1IXf7hs2eK5
G/fsuFBVi18rZSyIzom4lgyyBrkRy/edE6+nRUP+mNwmekgULZosmhJEL4jGix4WPSqaIJooCjY3lCaJ
aM6rH/LXjBtDsBO8N8F0n2iMiAs5905RuCjY3FCiMa982J/TW7SNGvU3iJOEw8UaLRYAAAAASUVORK5C
YII=
45
AAABAAEAlpYAAAEAIABwawEAFgAAACgAAACWAAAALAEAAAEAIAAAAAAAkF8BAMMOAADDDgAAAAAAAAAA
AAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgGAICYEQCAmCYAgJhKAICYewCAmLEAgJjhAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmOEAgJixAICYewCAmEoAgJgmAICYEQCA
mAYAgJgwAICYOQCAmEoAgJhpAICYkgCAmL4AgJjmAICY/ACAmP8AgJj/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wCAmP8AgJj/AICY/ACAmOYAgJi+AICYkgCAmGkAgJhKAICYOQCA
mDAAgJhoAICYbwCAmHsAgJiSAICYrwCAmNAAgJjtAICY/QB/l/8Af5f/AH+X/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+X/wB/l/8Af5f/AICY/QCAmO0AgJjQAICYrwCAmJIAgJh7AICYbwCA
mGgAgJimAICYqgCAmLEAgJi+AICY0ACAmOMAgJj0AICY/gB/l/8Af5f/AH+W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+W/wB/l/8Af5f/AICY/gCAmPQAgJjjAICY0ACAmL4AgJixAICYqgCA
mKYAgJjcAICY3gCAmOEAgJjmAICY7QCAmPQAgJj7AICY/wCAmP8AgJj/AICY/wCAmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCAmf8AgJn/AICZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AICZ/wCAmf8AgJn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgJn/AICY/wCAmP8AgJj/AICY/wCAmPsAgJj0AICY7QCAmOYAgJjhAICY3gCA
mNwAgJj7AICY/ACAmPwAgJj8AICY/QCAmP4AgJj/AIGZ/wCCmv8Ag5z/AIWe/wCGn/8Ah5//AIeg/wCH
oP8Ah6D/AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
n/8Ah5//AIef/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCH
oP8Bh6D/A4ig/wSIof8FiaH/Bomh/weJof8HiaH/B4mh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/B4mh/weJof8HiaH/Bomh/wWJof8EiKH/A4ig/wGH
oP8Ah6D/AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIef/wCH
n/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
oP8Ah6D/AIeg/wCHn/8Ahp//AIWe/wCDnP8Agpr/AIGZ/wCAmP8AgJj+AICY/QCAmPwAgJj8AICY/ACA
mPsAgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIKa/wCFnv8AiaL/AI2n/wCQqv8Akaz/AJKs/wCR
rP8Akaz/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wGR
q/8Dkqz/B5St/wuVrv8Ol6//EJiw/xGYsP8RmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xGYsP8RmLD/EJiw/w6Xr/8Lla7/B5St/wOS
rP8Bkav/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
rP8Akaz/AJKs/wCRrP8AkKr/AI2n/wCJov8AhZ7/AIKa/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIOc/wCJov8AkKr/AJax/wCbt/8Anrr/AJ+7/wCe
u/8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrr/AJ26/wCduv8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCcuf8AnLn/AJ25/wKd
uv8GoLv/DKK9/xOlv/8ZqMH/HarC/x6qwv8eqsL/HarC/xyqwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8cqsL/HarC/x6qwv8eqsL/HarC/xmowf8Tpb//DKK9/wag
u/8Cnbr/AJ25/wCcuf8AnLn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbr/AJ26/wCe
uv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrv/AJ+7/wCeuv8Am7f/AJax/wCQqv8AiaL/AIOc/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH+W/wB/lv8AgJj/AIWe/wCNp/8AlrH/AJ+8/wCnxP8Aqsj/AKvK/wCr
yf8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKnI/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnH/wCpx/8Aqcf/AKnH/wKq
yP8Ircr/EbHN/xu10P8judL/KbvU/yu81P8rvNT/KrzU/ym71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8pu9T/KrzU/yu81P8rvNT/KbvU/yO50v8btdD/EbHN/wit
yv8Cqsj/AKnH/wCpx/8Aqcf/AKnH/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aq8n/AKvK/wCqyP8Ap8T/AJ+8/wCWsf8Ajaf/AIWe/wCAmP8Af5b/AH+W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQqv8Am7f/AKfE/wCvzv8AtNP/ALXV/wC1
1P8AtNP/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz
0/8As9P/ALTT/wG00/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8As9P/AbTT/wS1
1P8Mudb/Fr3Z/yLC3P8sxt//Msnh/zXK4v82y+L/Nsri/zXK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v81yuL/Nsri/zbL4v81yuL/Msnh/yzG3/8iwtz/Fr3Z/wy5
1v8EtdT/AbTT/wCz0/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8BtNP/ALTT/wCz
0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wC0
0/8AtdT/ALXV/wC00/8Ar87/AKfE/wCbt/8AkKr/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALrb/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC4
2P8BuNj/ArnZ/wS62f8Gu9r/CLzb/wm82/8Kvdv/Cr3b/wq82/8JvNv/Cbzb/wi82/8HvNv/CLzb/wu9
3P8SwN7/HMTh/yfJ5P8wzeb/ONDo/zzS6f8/0+r/QdTq/0LU6v9D1er/Q9Xq/0PV6v9D1er/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PV6v9D1er/Q9Xq/0PV6v9C1Or/QdTq/z/T6v880un/ONDo/zDN5v8nyeT/HMTh/xLA
3v8Lvdz/CLzb/we82/8IvNv/Cbzb/wm82/8KvNv/Cr3b/wq92/8JvNv/CLzb/wa72v8Eutn/ArnZ/wG4
2P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALrb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCSrP8An7v/AKvK/wC11f8Autv/ALzd/wC8
3P8Au9v/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALna/wC5
2v8Butr/BLvb/wm93f8OwN7/EsHf/xTD4P8Vw+D/FsPg/xXD4P8Vw+D/FMPg/xPC4P8SwuD/E8Lg/xXD
4f8axeL/Isnk/yrM5/8y0On/OdPr/0DV7P9G1+3/S9nt/0/b7f9R3O7/Utzu/1Lc7v9R3O7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Hc7v9S3O7/Utzu/1Hc7v9P2+3/S9nt/0bX7f9A1ez/OdPr/zLQ6f8qzOf/Isnk/xrF
4v8Vw+H/E8Lg/xLC4P8TwuD/FMPg/xXD4P8Vw+D/FsPg/xXD4P8Uw+D/EsHf/w7A3v8Jvd3/BLvb/wG6
2v8Audr/ALna/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC7
2/8AvNz/ALzd/wC62/8AtdX/AKvK/wCfu/8Akqz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrv/AKvJ/wC11P8Autr/ALzc/wC7
3P8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC52v8Audn/ALnZ/wC5
2f8Cutr/B7zb/w6/3v8Ww+D/Hcbi/yHI4/8jyOT/I8nk/yLI5P8iyOP/Icjj/yDH4/8fx+P/H8fj/yHI
5P8kyeT/KMvm/y3N5/8z0On/OtPq/0PW7P9M2e3/Vd3u/1zf7/9g4e//YeHv/2Dh7/9f4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/1/g7/9g4e//YeHv/2Dh7/9c3+//Vd3u/0zZ7f9D1uz/OtPq/zPQ6f8tzef/KMvm/yTJ
5P8hyOT/H8fj/x/H4/8gx+P/Icjj/yLI4/8iyOT/I8nk/yPI5P8hyOP/Hcbi/xbD4P8Ov97/B7zb/wK6
2v8Audn/ALnZ/wC52f8Audr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC6
2v8Au9z/ALzc/wC62v8AtdT/AKvJ/wCeu/8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALvb/wC6
2v8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC42f8AuNj/ALjY/wC4
2P8Dudn/Crzb/xPB3v8exeH/J8nk/yzM5f8vzeb/L83m/y7M5v8tzOb/Lczm/y3M5f8szOX/Lczl/y3M
5v8uzOb/MM3n/zLO5/820Oj/PNLp/0bW6v9S2uz/Xd/t/2fi7/9s5O//buXv/27l7/9t5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/23k7/9u5e//buXv/2zk7/9n4u//Xd/t/1La7P9G1ur/PNLp/zbQ6P8yzuf/MM3n/y7M
5v8tzOb/Lczl/yzM5f8tzOX/Lczm/y3M5v8uzOb/L83m/y/N5v8szOX/J8nk/x7F4f8Twd7/Crzb/wO5
2f8AuNj/ALjY/wC42P8AuNn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC5
2f8Autr/ALvb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK5
2f8Gu9r/Dr7c/xnD3/8kyOL/Lszl/zTO5/83z+j/N9Do/zbP6P82z+f/Ns/n/zfP5/840Oj/OdDo/zrQ
6P860Oj/OdDo/znQ6P880ej/QdPp/0vX6v9Y3Oz/ZeHu/2/l7/915/D/eOjw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eOjw/3Xn8P9v5e//ZeHu/1jc7P9L1+r/QdPp/zzR6P850Oj/OdDo/zrQ
6P860Oj/OdDo/zjQ6P83z+f/Ns/n/zbP5/82z+j/N9Do/zfP6P80zuf/Lszl/yTI4v8Zw9//Dr7c/wa7
2v8Cudn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK42P8Dudn/Brra/wm8
2/8Pvtz/FsLe/yDG4f8qyuT/Ms3m/zfQ6P850en/OdHp/znQ6P850Oj/O9Hp/z7S6f9B0+n/RNXq/0fW
6v9H1ur/RtXq/0XV6v9G1er/Stfq/1Pa6/9e3u3/aePu/3Pm7/966fD/f+vx/4Ps8v+F7fP/h+3z/4ju
9P+J7vT/iO/0/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv
9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/0/4nu
9P+I7vT/h+3z/4Xt8/+D7PL/f+vx/3rp8P9z5u//aePu/17e7f9T2uv/Stfq/0bV6v9F1er/RtXq/0fW
6v9H1ur/RNXq/0HT6f8+0un/O9Hp/znQ6P850Oj/OdHp/znR6f830Oj/Ms3m/yrK5P8gxuH/FsLe/w++
3P8JvNv/Brra/wO52f8CuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC31/8At9f/AbjY/wS52f8Iu9r/Db3c/xPA
3f8Zw9//IMbh/yfJ4/8uzOX/NM7n/zfQ6P840On/ONDp/zjQ6P850Oj/PNLp/0PU6v9J1+v/UNnr/1Tb
7P9W2+z/Vdvs/1Pa7P9T2uv/Vtvs/1ze7P9k4e3/bOTu/3Xn8P996vH/hO3y/4zv9P+S8fX/l/P3/5n0
+P+Z9fn/mfb5/5j2+v+X9vv/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3
+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f2+/+Y9vr/mfb5/5n1
+f+Z9Pj/l/P3/5Lx9f+M7/T/hO3y/33q8f915/D/bOTu/2Th7f9c3uz/Vtvs/1Pa6/9T2uz/Vdvs/1bb
7P9U2+z/UNnr/0nX6/9D1Or/PNLp/znQ6P840Oj/ONDp/zjQ6f830Oj/NM7n/y7M5f8nyeP/IMbh/xnD
3/8TwN3/Db3c/wi72v8Eudn/AbjY/wC31/8At9f/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALfY/wC31/8At9f/AbjY/wa62f8Nvdv/FcHe/x7F
4P8lyOL/Ksrk/y7M5f8yzuf/Nc/n/zfQ6P830Oj/Ns/o/zbP6P840Oj/PtLp/0fW6v9R2ev/W93t/2Hg
7f9k4e7/ZOHu/2Pg7f9i4O3/Y+Dt/2bh7v9q4+7/cOXv/3bn8P9+6vH/h+3z/5Lx9f+b9Pf/ovb4/6X4
+v+m+fv/pfr8/6T6/P+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6
/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+k+vz/pfr8/6b5
+/+l+Pr/ovb4/5v09/+S8fX/h+3z/37q8f925/D/cOXv/2rj7v9m4e7/Y+Dt/2Lg7f9j4O3/ZOHu/2Th
7v9h4O3/W93t/1HZ6/9H1ur/PtLp/zjQ6P82z+j/Ns/o/zfQ6P830Oj/Nc/n/zLO5/8uzOX/Ksrk/yXI
4v8exeD/FcHe/w292/8Gutn/AbjY/wC31/8At9f/ALfY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC32P8AuNj/ArnY/wi72v8Rv93/HMTg/yfJ
4/8uzOX/M87n/zbP5/830Oj/ONDo/zjQ6P840Oj/N9Do/zfQ6P860ej/QdPp/0vX6v9Y3Oz/ZODu/2zk
7/9w5e//ceXv/3Hl7/9w5e//cOXv/3Hl7/9y5u//defw/3jo8P9/6vH/iO3y/5Pw9P+d8vX/pfT2/6j1
9v+q9vb/qfX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j1
9v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qfX2/6r2
9v+o9fb/pfT2/53y9f+T8PT/iO3y/3/q8f946PD/defw/3Lm7/9x5e//cOXv/3Dl7/9x5e//ceXv/3Dl
7/9s5O//ZODu/1jc7P9L1+r/QdPp/zrR6P830Oj/N9Do/zjQ6P840Oj/ONDo/zfQ6P82z+f/M87n/y7M
5f8nyeP/HMTg/xG/3f8Iu9r/ArnY/wC42P8At9j/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8BuNj/AbjY/wG52P8Dudn/B7va/w6+3P8Xwt//I8fi/y3L
5f81z+f/OdHo/zzS6f890un/PtLp/z/S6f8+0un/PdLp/z3S6f9A0+n/R9bq/1La6/9f3u3/a+Pu/3Tm
7/956PD/e+nx/3zp8f996fH/ferx/33q8f996vH/ferx/3/q8f+C6vH/iOvx/4/r8P+V6+//muvt/53p
6/+f5+j/oOXl/6Hj4/+h4uH/oeHg/6Hh4P+h4eD/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh
4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4P+h4eD/oeHg/6Hi4f+h4+P/oOXl/5/n
6P+d6ev/muvt/5Xr7/+P6/D/iOvx/4Lq8f9/6vH/ferx/33q8f996vH/ferx/33p8f986fH/e+nx/3no
8P905u//a+Pu/1/e7f9S2uv/R9bq/0DT6f890un/PdLp/z7S6f8/0un/PtLp/z3S6f880un/OdHo/zXP
5/8ty+X/I8fi/xfC3/8Ovtz/B7va/wO52f8Budj/AbjY/wG42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALfY/wC42P8CuNj/BLnZ/we72v8Lvdv/EL/d/xbC3v8fxeH/KMnk/zDN
5v830Oj/PdLp/0LU6v9F1er/SNbq/0rX6v9K1+r/Sdbq/0nW6v9L1+r/UNnr/1nd7P9k4e3/buTv/3fo
8P9+6vH/g+zy/4fu8/+L7/T/jfD1/47x9v+N8fb/jPH3/4vw9v+J7fP/hunw/4Pk6/+A3uX/f9jf/4DS
1/+DzM//h8bH/4rBwP+Mvbv/jby5/427uP+NvLn/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428
uv+NvLr/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428uf+Nu7j/jby5/4y9u/+KwcD/h8bH/4PM
z/+A0tf/f9jf/4De5f+D5Ov/hunw/4nt8/+L8Pb/jPH3/43x9v+O8fb/jfD1/4vv9P+H7vP/g+zy/37q
8f936PD/buTv/2Th7f9Z3ez/UNnr/0vX6v9J1ur/Sdbq/0rX6v9K1+r/SNbq/0XV6v9C1Or/PdLp/zfQ
6P8wzeb/KMnk/x/F4f8Wwt7/EL/d/wu92/8Hu9r/BLnZ/wK42P8AuNj/ALfY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8At9f/ALfX/wC32P8Dudj/CLva/w6+3P8Uwd7/G8Pg/yHG4f8nyeP/LMvl/zLO
5/840Oj/P9Pp/0fW6v9O2Ov/VNvs/1jc7P9Z3Oz/WNzs/1fc7P9Y3Oz/XN7s/2Hg7f9p4u7/cOXv/3jo
8P+A6/L/ie7z/5Hx9f+Y8/f/nPX4/573+v+f+fz/nfn8/5n2+v+Q8PX/gubt/3PZ4/9kzNj/W8DL/1q0
vv9eqa//ZJ6g/2uVlP9vj4v/cYyI/3GMh/9xjYj/cI2J/3COif9wjon/cI6J/3COif9wjon/cI6J/3CO
if9wjon/cI6J/3COif9wjon/cI6J/3COif9wjon/cI2J/3GNiP9xjIf/cYyI/2+Pi/9rlZT/ZJ6g/16p
r/9atL7/W8DL/2TM2P9z2eP/gubt/5Dw9f+Z9vr/nfn8/5/5/P+e9/r/nPX4/5jz9/+R8fX/ie7z/4Dr
8v946PD/cOXv/2ni7v9h4O3/XN7s/1jc7P9X3Oz/WNzs/1nc7P9Y3Oz/VNvs/07Y6/9H1ur/P9Pp/zjQ
6P8yzuf/LMvl/yfJ4/8hxuH/G8Pg/xTB3v8Ovtz/CLva/wO52P8At9j/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8At9f/ALfX/wC42P8Eudn/DL3b/xXB3v8exeD/Jsjj/yvL5P8uzOb/Mc3m/zTO
5/850ej/QtTp/0zY6/9X3Oz/YN/t/2bh7v9o4u7/Z+Lu/2bi7v9m4e7/aOLu/2vj7v9u5e//c+bv/3no
8P+B6/L/jO/0/5fy9f+g9ff/pvf5/6r6+/+s/P3/qvz9/6P4+v+U7vL/fd7m/2HL1/9It8f/OKW1/zOU
ov84hI3/QnZ5/0xqaP9RYVz/VF1X/1RdVv9TXlf/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1Nf
Wf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NeV/9UXVb/VF1X/1FhXP9Mamj/QnZ5/ziE
jf8zlKL/OKW1/0i3x/9hy9f/fd7m/5Tu8v+j+Pr/qvz9/6z8/f+q+vv/pvf5/6D19/+X8vX/jO/0/4Hr
8v956PD/c+bv/27l7/9r4+7/aOLu/2bh7v9m4u7/Z+Lu/2ji7v9m4e7/YN/t/1fc7P9M2Ov/QtTp/znR
6P80zuf/Mc3m/y7M5v8ry+T/Jsjj/x7F4P8Vwd7/DL3b/wS52f8AuNj/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wK52P8Hu9r/EL/d/xvD4P8myOP/L8zl/zTO5/82z+f/Ns/o/zjQ
6P890un/RtXq/1La6/9f3+3/auPu/3Hl7/905/D/defw/3Tn8P905vD/dOfw/3Xn8P925/D/eOjw/3zp
8P+D6/H/jO3y/5bv8/+f8vT/pfP0/6r19f+t9vb/rPX1/6Xv8P+T4+b/ddDY/1K5xv8yobL/HYye/xd4
iP8dZXD/KFVY/zNHRP86PTf/PTkx/z04MP88OTH/PDoz/zw7M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7
M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7M/88OzP/PDoz/zw5Mf89ODD/PTkx/zo9N/8zR0T/KFVY/x1l
cP8XeIj/HYye/zKhsv9Sucb/ddDY/5Pj5v+l7/D/rPX1/6329v+q9fX/pfP0/5/y9P+W7/P/jO3y/4Pr
8f986fD/eOjw/3bn8P915/D/dOfw/3Tm8P905/D/defw/3Tn8P9x5e//auPu/1/f7f9S2uv/RtXq/z3S
6f840Oj/Ns/o/zbP5/80zuf/L8zl/ybI4/8bw+D/EL/d/we72v8Cudj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2v8AuNn/AbjY/wG42P8Cudn/BLrZ/wi72v8Ovtz/FsLe/yHG4f8ry+T/NM7n/znQ6P880en/PdLp/0DT
6f9F1er/Ttjr/1nc7P9l4e7/cOXv/3jo8P986fH/furx/4Dq8f+A6vH/gevy/4Hr8v+B7PL/gezz/4Pr
8v+F6/H/ierw/43o7v+R5+v/leXo/5nk5v+e4uP/n9/e/5nX1/+Iysz/are9/0ihrP8oipn/EnWF/wxi
cP8RUFn/HD9C/ycyL/8tKSH/LyQb/zAjGv8vJBz/LiYe/y4mHv8uJh7/LiYe/y4mHv8uJh7/LiYe/y4m
Hv8uJh7/LiYe/y4mHv8uJh7/LiYe/y4mHv8uJh7/LiYe/y8kHP8wIxr/LyQb/y0pIf8nMi//HD9C/xFQ
Wf8MYnD/EnWF/yiKmf9Ioaz/are9/4jKzP+Z19f/n9/e/57i4/+Z5Ob/leXo/5Hn6/+N6O7/ierw/4Xr
8f+D6/L/gezz/4Hs8v+B6/L/gevy/4Dq8f+A6vH/furx/3zp8f946PD/cOXv/2Xh7v9Z3Oz/Ttjr/0XV
6v9A0+n/PdLp/zzR6f850Oj/NM7n/yvL5P8hxuH/FsLe/w6+3P8Iu9r/BLrZ/wK52f8BuNj/AbjY/wC4
2f8Audr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2f8AuNj/AbjY/wS52f8Iu9r/DL3b/xG/3f8Xwt//H8Xh/yfJ4/8uzOb/Ns/n/zzR6f9B0+n/RdXq/0rX
6v9Q2ev/WNzs/2Hf7f9q4+7/c+bv/3rp8P+A6/H/huzy/4rt8v+N7vP/kPD0/5Hx9v+R8/f/kPP4/47x
9v+J7PP/g+bt/3ze5v921t7/dM7W/3jIzf9+wcT/grq6/4Cwr/9zo6P/XJOV/z+Bh/8lb3j/E11p/w5O
V/8RPkT/GDEx/yElIf8lHRb/JxoR/ycZEP8nGhH/JhsS/yYbE/8mGxP/JhsT/ycbE/8nGxP/JxsT/ycb
E/8nGxP/JxsT/ycbE/8nGxP/JhsT/yYbE/8mGxP/JhsS/ycaEf8nGRD/JxoR/yUdFv8hJSH/GDEx/xE+
RP8OTlf/E11p/yVveP8/gYf/XJOV/3Ojo/+AsK//grq6/37BxP94yM3/dM7W/3bW3v983ub/g+bt/4ns
8/+O8fb/kPP4/5Hz9/+R8fb/kPD0/43u8/+K7fL/huzy/4Dr8f966fD/c+bv/2rj7v9h3+3/WNzs/1DZ
6/9K1+r/RdXq/0HT6f880en/Ns/n/y7M5v8nyeP/H8Xh/xfC3/8Rv93/DL3b/wi72v8Eudn/AbjY/wC4
2P8Audn/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC5
2f8AuNj/ArjY/we62v8Ovdz/FcHe/xzE4P8jx+L/KMnk/yzL5f8xzeb/Ns/o/z3S6f9F1er/Tdjr/1bb
7P9d3u3/Y+Dt/2nj7v9u5e//dOfw/3vp8P+D6/H/i+7y/5Pw9P+Z8vX/nfT3/6D3+f+h+fz/n/n8/5n1
+f+M7PL/et/o/2bQ2/9WwM3/TrK//1CmsP9XmqD/X4+P/2KDgf9bd3T/TGtq/zpfYP8oVFf/G0hN/xc+
Qf8YMzP/HSkm/yEhG/8kGxP/JRkQ/yUYD/8lGRD/JRoR/yUaEf8lGhL/JRoS/yUaEv8lGhL/JRoS/yUa
Ev8lGhL/JRoS/yUaEv8lGhL/JRoS/yUaEv8lGhH/JRoR/yUZEP8lGA//JRkQ/yQbE/8hIRv/HSkm/xgz
M/8XPkH/G0hN/yhUV/86X2D/TGtq/1t3dP9ig4H/X4+P/1eaoP9QprD/TrK//1bAzf9m0Nv/et/o/4zs
8v+Z9fn/n/n8/6H5/P+g9/n/nfT3/5ny9f+T8PT/i+7y/4Pr8f976fD/dOfw/27l7/9p4+7/Y+Dt/13e
7f9W2+z/Tdjr/0XV6v890un/Ns/o/zHN5v8sy+X/KMnk/yPH4v8cxOD/FcHe/w693P8Hutr/ArjY/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC5
2f8AuNj/A7nZ/wq82/8TwN3/HsXg/yfJ4/8ty+X/MM3m/zLO5/80zuf/ONDo/0DT6f9K1+r/Vtvs/2Hf
7f9p4u7/buTv/3Hm7/9z5u//dufw/3zp8f+F7PL/j+/z/5ry9f+i9Pb/p/b3/6v5+v+t+/v/qvn7/6Dz
9v+M5uv/b9Pd/1G+zP84qbr/K5an/yuFkv8zdXz/PmZn/0VZVv9FT0n/P0dC/zZCPv8tPTr/Jzg2/yUz
Mf8lLir/Jyok/yomH/8rIxv/LCIZ/ywiGf8sIhr/KyIa/ysiGv8rIhr/LCIa/ywiGv8sIhr/LCMa/ywj
Gv8sIxr/LCMa/ywiGv8sIhr/LCIa/ysiGv8rIhr/KyIa/ywiGv8sIhn/LCIZ/ysjG/8qJh//Jyok/yUu
Kv8lMzH/Jzg2/y09Ov82Qj7/P0dC/0VPSf9FWVb/PmZn/zN1fP8rhZL/K5an/zipuv9Rvsz/b9Pd/4zm
6/+g8/b/qvn7/637+/+r+fr/p/b3/6L09v+a8vX/j+/z/4Xs8v986fH/dufw/3Pm7/9x5u//buTv/2ni
7v9h3+3/Vtvs/0rX6v9A0+n/ONDo/zTO5/8yzuf/MM3m/y3L5f8nyeP/HsXg/xPA3f8KvNv/A7nZ/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Cudn/Brva/w++3P8Zw9//Jcji/y7M5f81z+f/N9Do/zjQ6P850ej/PdLp/0XV6v9Q2ev/Xd7t/2ni
7v9y5u//d+fw/3jo8P956PD/e+nw/4Dq8f+I7fP/k/D0/53z9v+l9fb/qvX2/6719f+u9PP/qu/v/57m
5/+G1tv/ZcHK/0GpuP8kkqP/FH2P/xNqeP8cV1//KEhJ/zI7Nv82Myz/Ni8n/zQvJ/8yLyn/MTAq/zIx
K/81Miv/ODMs/zo0Lf88NS3/PTUt/z01Lf88NS3/PDUt/zw1Lf88NS3/PDQt/zw0Lf87NC3/OzQt/zs0
Lf87NC3/OzQt/zs0Lf88NC3/PDQt/zw1Lf88NS3/PDUt/zw1Lf89NS3/PTUt/zw1Lf86NC3/ODMs/zUy
K/8yMSv/MTAq/zIvKf80Lyf/Ni8n/zYzLP8yOzb/KEhJ/xxXX/8Tanj/FH2P/ySSo/9Bqbj/ZcHK/4bW
2/+e5uf/qu/v/6708/+u9fX/qvX2/6X19v+d8/b/k/D0/4jt8/+A6vH/e+nw/3no8P946PD/d+fw/3Lm
7/9p4u7/Xd7t/1DZ6/9F1er/PdLp/znR6P840Oj/N9Do/zXP5/8uzOX/Jcji/xnD3/8Pvtz/Brva/wK5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anbr/AKrI/wC00/8Cudn/A7vb/wa8
2/8JvNv/Dr7c/xbC3v8gxuH/Ksrk/zPO5/850ej/PdLp/z/T6f9C1On/RtXq/07Y6/9Y3Oz/Y+Dt/27k
7/935/D/fOnw/3/q8f+B6/H/g+vy/4jt8/+O8PX/lvP3/531+P+i9ff/pPHy/6Xr6/+j4uH/nNfW/4/J
yf94uLv/WaSr/ziPmv8deoj/Dmd1/wxUYP8TQ0n/HTQ0/ycpJP8tJBz/MCMb/zMmHv82KyT/OjEq/0A4
Mf9IQDn/UElC/1dQSf9bVU7/XVdR/15XUf9dV1H/XFZQ/1xWUP9bVk//W1VP/1pVT/9ZVU7/WVRO/1lU
Tv9ZVE7/WVRO/1lVTv9aVU//W1VP/1tWT/9cVlD/XFZQ/11XUf9eV1H/XVdR/1tVTv9XUEn/UElC/0hA
Of9AODH/OjEq/zYrJP8zJh7/MCMb/y0kHP8nKST/HTQ0/xNDSf8MVGD/Dmd1/x16iP84j5r/WaSr/3i4
u/+Pycn/nNfW/6Pi4f+l6+v/pPHy/6L19/+d9fj/lvP3/47w9f+I7fP/g+vy/4Hr8f9/6vH/fOnw/3fn
8P9u5O//Y+Dt/1jc7P9O2Ov/RtXq/0LU6f8/0+n/PdLp/znR6P8zzuf/Ksrk/yDG4f8Wwt7/Dr7c/wm8
2/8GvNv/A7vb/wK52f8AtNP/AKrI/wCduv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbr/AKrI/wG00/8Eutn/CL3d/w2/
3v8Twd7/GcPf/yDG4f8nyeP/L8zl/zbP5/880un/QtTq/0fW6v9M2Ov/Utrr/1nc7P9h3+3/aePu/3Hm
7/946PD/f+rx/4Ts8v+K7fL/ju7z/5Lw9P+W8/j/mff7/5v4/P+b9fj/mOvu/5Tc3P+OyMf/hLSx/3eh
nv9kkI//TH+C/zJvdf8eYGj/ElFa/xBCSP8UNDb/Gygm/yMgGv8oHhb/LiAY/zMmHv86Lyj/Qzo0/1BH
Qf9fWFL/b2lk/314c/+Hgn3/i4aC/4yHg/+LhoH/iYSA/4iEf/+Hg3//hYJ+/4SCff+DgX3/goF8/4KB
fP+CgXz/goF8/4OBff+Egn3/hYJ+/4eDf/+IhH//iYSA/4uGgf+Mh4P/i4aC/4eCff99eHP/b2lk/19Y
Uv9QR0H/Qzo0/zovKP8zJh7/LiAY/ygeFv8jIBr/Gygm/xQ0Nv8QQkj/ElFa/x5gaP8yb3X/TH+C/2SQ
j/93oZ7/hLSx/47Ix/+U3Nz/mOvu/5v1+P+b+Pz/mff7/5bz+P+S8PT/ju7z/4rt8v+E7PL/f+rx/3jo
8P9x5u//aePu/2Hf7f9Z3Oz/Utrr/0zY6/9H1ur/QtTq/zzS6f82z+f/L8zl/yfJ4/8gxuH/GcPf/xPB
3v8Nv97/CL3d/wS62f8BtNP/AKrI/wCduv8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbn/AKrI/wG00/8Gu9r/DcDe/xXD
4P8exeH/JMji/yrK5P8uzOX/Ms7n/zfQ6P890un/RdXq/07Y6/9X3Oz/X9/t/2Xh7v9q4+7/b+Xv/3Pm
7/956PD/gevx/4rt8v+S7/T/mfH1/5zz9v+c9vr/mvn9/5b4/f+Q8fb/iOHl/3/Iyv91qqn/aY2K/111
cf9PZWH/P1lX/zBQUP8kSEr/HT9B/xo1Nv8cLCr/ICQf/yUgGf8qIRn/MCUe/zcuKP9BOTT/TkhE/2Fb
WP95dHH/kY2K/6ajoP+1sq//u7i2/726t/+7uLX/ubaz/7e1sv+1tLH/s7Ow/7Gyr/+vsa7/rrCu/62w
rf+tsK3/rrCu/6+xrv+xsq//s7Ow/7W0sf+3tbL/ubaz/7u4tf+9urf/u7i2/7Wyr/+mo6D/kY2K/3l0
cf9hW1j/TkhE/0E5NP83Lij/MCUe/yohGf8lIBn/ICQf/xwsKv8aNTb/HT9B/yRISv8wUFD/P1lX/09l
Yf9ddXH/aY2K/3Wqqf9/yMr/iOHl/5Dx9v+W+P3/mvn9/5z2+v+c8/b/mfH1/5Lv9P+K7fL/gevx/3no
8P9z5u//b+Xv/2rj7v9l4e7/X9/t/1fc7P9O2Ov/RdXq/z3S6f830Oj/Ms7n/y7M5f8qyuT/JMji/x7F
4f8Vw+D/DcDe/wa72v8BtNP/AKrI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbn/AKnI/wK00/8IvNv/EsHf/xzG
4v8nyeT/Lszl/zLN5v80zuf/Nc/n/zjQ6P8+0un/SNbq/1Tb7P9g3+3/auPu/3Dl7/9z5u//dOfw/3bn
8P976fD/g+vy/47u8/+Z8fX/ofT2/6P09v+f9vn/mPb6/47y+P+D6O7/eNLX/2uytP9djYz/UGpm/0VP
Sf89QDr/NTk0/zA3Mv8sNjL/KTQw/ykvK/8pLCb/LCki/y8pIv81LSb/OjMt/0I9OP9NSkf/XVpZ/3Ry
cf+RkI//sK6t/8rJyP/c29r/5OPi/+bl4//k4+H/4eDf/9/f3v/d3tz/2tzb/9fb2v/V2tn/1NnY/9PZ
2P/T2dj/1NnY/9Xa2f/X29r/2tzb/93e3P/f397/4eDf/+Tj4f/m5eP/5OPi/9zb2v/Kycj/sK6t/5GQ
j/90cnH/XVpZ/01KR/9CPTj/OjMt/zUtJv8vKSL/LCki/yksJv8pLyv/KTQw/yw2Mv8wNzL/NTk0/z1A
Ov9FT0n/UGpm/12NjP9rsrT/eNLX/4Po7v+O8vj/mPb6/5/2+f+j9Pb/ofT2/5nx9f+O7vP/g+vy/3vp
8P925/D/dOfw/3Pm7/9w5e//auPu/2Df7f9U2+z/SNbq/z7S6f840Oj/Nc/n/zTO5/8yzeb/Lszl/yfJ
5P8cxuL/EsHf/wi82/8CtNP/AKnI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8JvNv/FMPg/yHI
4/8szOX/NM7n/zfQ6P830Oj/N9Do/zjQ6P8/0un/Stfq/1jc7P9m4e7/ceXv/3jo8P966fD/e+nw/3zp
8f+A6vH/iO3z/5Lw9P+c8/b/o/T2/6Pz9f+c8fP/kezw/4Tk6f921dr/ab3B/1uanP9MdHL/QFBM/zc3
MP8yKiP/MCcg/zEqIv8zLif/NTAq/zcyK/86NC3/Pjgx/0M9Nv9JQz3/T0pF/1dUUP9hYF7/cXFw/4iJ
if+mp6f/xsfH/+Li4v/09fT//P39//7//v/8/Pz/+fr5//f5+P/19/f/8vb2/+/19P/t9PP/6/Pz/+vz
8//r8/P/6/Pz/+308//v9fT/8vb2//X39//3+fj/+fr5//z8/P/+//7//P39//T19P/i4uL/xsfH/6an
p/+IiYn/cXFw/2FgXv9XVFD/T0pF/0lDPf9DPTb/Pjgx/zo0Lf83Miv/NTAq/zMuJ/8xKiL/MCcg/zIq
I/83NzD/QFBM/0x0cv9bmpz/ab3B/3bV2v+E5On/kezw/5zx8/+j8/X/o/T2/5zz9v+S8PT/iO3z/4Dq
8f986fH/e+nw/3rp8P946PD/ceXv/2bh7v9Y3Oz/Stfq/z/S6f840Oj/N9Do/zfQ6P830Oj/NM7n/yzM
5f8hyOP/FMPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8Kvdv/FcPg/yPI
5P8vzeb/N8/o/znR6f840On/N9Do/zjQ6P8+0un/Stfq/1nc7P9o4u7/dOfw/3zp8f+A6/H/g+vx/4Xs
8v+I7fP/jvD1/5bz+P+c9vr/n/b5/5zx8/+T5+r/htre/3fKzv9otrn/Wp2f/01+ff9AXVn/Nj85/zAr
I/8tIhn/LyEZ/zMnH/85Lif/QDYv/0g/OP9SSUP/XFRO/2VfWf9taGP/c3Bs/3h3df+AgYD/jI6O/6Ci
ov+5u7z/1NXV/+vs7P/7+/v///////////////////////7////8////+v7///j+/v/2/v7/9f7+//X+
/v/1/v7/9f7+//b+/v/4/v7/+v7///z////+//////////////////////////v7+//r7Oz/1NXV/7m7
vP+goqL/jI6O/4CBgP94d3X/c3Bs/21oY/9lX1n/XFRO/1JJQ/9IPzj/QDYv/zkuJ/8zJx//LyEZ/y0i
Gf8wKyP/Nj85/0BdWf9Nfn3/Wp2f/2i2uf93ys7/htre/5Pn6v+c8fP/n/b5/5z2+v+W8/j/jvD1/4jt
8/+F7PL/g+vx/4Dr8f986fH/dOfw/2ji7v9Z3Oz/Stfq/z7S6f840Oj/N9Do/zjQ6f850en/N8/o/y/N
5v8jyOT/FcPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8Kvdv/FsPg/yPJ
5P8vzeb/N9Do/znR6f840On/Ns/o/zfQ6P890un/Sdbq/1jc7P9n4u7/defw/37q8f+G7PL/i+7y/4/v
8/+T8PT/lvP3/5n3+/+a+f3/mPb6/5Hs8P+G2t7/d8PG/2epq/9YkJD/THh3/0FfXP84R0L/MTMt/y4n
H/8uIhr/MSQd/zcsJf9ANjH/S0M+/1tTTv9tZ2L/gHp2/4+Lh/+al5P/n52b/6Giof+lqKf/rLCw/7q+
vv/Mz9D/4OLi//Hy8v/8/Pz///////////////////////7////8////+v////n////3////9/////b/
///2////9/////f////5////+v////z////+//////////////////////////z8/P/x8vL/4OLi/8zP
0P+6vr7/rLCw/6Wop/+hoqH/n52b/5qXk/+Pi4f/gHp2/21nYv9bU07/S0M+/0A2Mf83LCX/MSQd/y4i
Gv8uJx//MTMt/zhHQv9BX1z/THh3/1iQkP9nqav/d8PG/4ba3v+R7PD/mPb6/5r5/f+Z9/v/lvP3/5Pw
9P+P7/P/i+7y/4bs8v9+6vH/defw/2fi7v9Y3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6f850en/N9Do/y/N
5v8jyeT/FsPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8KvNv/FcPg/yLI
5P8uzOb/Ns/o/znQ6P840Oj/Ns/o/zfQ6P890un/Sdbq/1fc7P9m4e7/dOfw/4Dq8f+K7fL/k/D0/5ry
9f+d8/b/nfX4/5v4/P+W+P3/jvL4/4Tk6f93ys7/Z6mr/1eIh/9Jamf/P1RQ/zhDPf8yNS//MC0l/y8o
IP8yKCH/Ni0n/z43Mv9JRED/WVRR/3Braf+KhoT/pKGf/7q3tf/GxMP/ysrJ/8rMy//Jzc3/y9DQ/9LY
2P/c4uL/5+3t//D29v/2/Pz/+f////r////5////+P7+//f+/v/3/f3/9v39//X8/P/0/Pz/8/z8//P8
/P/z/Pz/8/z8//T8/P/1/Pz/9v39//f9/f/3/v7/+P7+//n////6////+f////b8/P/w9vb/5+3t/9zi
4v/S2Nj/y9DQ/8nNzf/KzMv/ysrJ/8bEw/+6t7X/pKGf/4qGhP9wa2n/WVRR/0lEQP8+NzL/Ni0n/zIo
If8vKCD/MC0l/zI1L/84Qz3/P1RQ/0lqZ/9XiIf/Z6mr/3fKzv+E5On/jvL4/5b4/f+b+Pz/nfX4/53z
9v+a8vX/k/D0/4rt8v+A6vH/dOfw/2bh7v9X3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6P850Oj/Ns/o/y7M
5v8iyOT/FcPg/wq82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8JvNv/FcPg/yLI
4/8tzOb/Ns/n/znQ6P850Oj/ONDo/zrR6P9A0+n/S9fq/1jc7P9m4e7/dObw/4Dq8f+N7vP/mfL1/6L0
9v+l9fb/ovX3/5v1+P+Q8fb/g+ju/3bV2v9otrn/WJCQ/0lqZ/8+S0b/Njgx/zEuJv8wKSL/MSoi/zQt
Jf85Miv/Pzo1/0lGQv9XVVP/amlo/4WEhP+kpKP/w8LC/9vb2v/o6ej/7O7t/+rt7f/l6+v/4+rq/+Xs
7P/o7/D/7PPz/+/29v/x+Pn/8vn5//L6+v/y+fn/8vn5//L5+f/x+fn/8fn5//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8fn5//H5+f/y+fn/8vn5//L5+f/y+vr/8vn5//H4+f/v9vb/7PPz/+jv
8P/l7Oz/4+rq/+Xr6//q7e3/7O7t/+jp6P/b29r/w8LC/6Sko/+FhIT/amlo/1dVU/9JRkL/Pzo1/zky
K/80LSX/MSoi/zApIv8xLib/Njgx/z5LRv9Jamf/WJCQ/2i2uf921dr/g+ju/5Dx9v+b9fj/ovX3/6X1
9v+i9Pb/mfL1/43u8/+A6vH/dObw/2bh7v9Y3Oz/S9fq/0DT6f860ej/ONDo/znQ6P850Oj/Ns/n/y3M
5v8iyOP/FcPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnH/wK00/8JvNv/FcPg/yHI
4/8tzOb/Ns/n/zvR6f880un/PtLp/0HT6f9H1ur/UNnr/1ze7P9o4u7/dOfw/4Hr8v+Q8PT/nfT3/6f2
9/+q9fb/pPHy/5jr7v+I4eX/eNLX/2m9wf9anZ//THh3/z9UUP82ODH/MCkh/y4jG/8vJRz/Myoj/zkz
LP9CPDf/TElF/1pYVv9ra2r/f4CA/5ucnP+6u7v/19jY/+7v7//6/Pz//f////r////1+/v/8fj4//D4
+P/v+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4/+/4
+P/w+Pj/8fj4//X7+//6/////f////r8/P/u7+//19jY/7q7u/+bnJz/f4CA/2trav9aWFb/TElF/0I8
N/85Myz/Myoj/y8lHP8uIxv/MCkh/zY4Mf8/VFD/THh3/1qdn/9pvcH/eNLX/4jh5f+Y6+7/pPHy/6r1
9v+n9vf/nfT3/5Dw9P+B6/L/dOfw/2ji7v9c3uz/UNnr/0fW6v9B0+n/PtLp/zzS6f870en/Ns/n/y3M
5v8hyOP/FcPg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wK00/8JvNv/FMLg/yHH
4/8tzOX/N8/n/z7S6f9C1Or/R9bq/0vX6v9S2uv/Wd3s/2Hg7f9r4+7/defw/4Hr8v+R8fb/oPf5/6v5
+v+u9fX/pevr/5Tc3P9/yMr/a7K0/1uanP9Nfn3/QV9c/zhDPf8xLib/LiMb/y4hGf8xJh//Ny8p/0A7
Nv9NSkb/Xlxa/3FxcP+Fh4f/mp2d/7K0tf/LzM3/4uPj//P09P/9/v7///////3////5////9f39//T8
/P/y+/v/8fr6//D5+f/w+Pj/7/j4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/7/j4//D4+P/w+fn/8fr6//L7
+//0/Pz/9f39//n////9//////////3+/v/z9PT/4uPj/8vMzf+ytLX/mp2d/4WHh/9xcXD/Xlxa/01K
Rv9AOzb/Ny8p/zEmH/8uIRn/LiMb/zEuJv84Qz3/QV9c/01+ff9bmpz/a7K0/3/Iyv+U3Nz/pevr/671
9f+r+fr/oPf5/5Hx9v+B6/L/defw/2vj7v9h4O3/Wd3s/1La6/9L1+r/R9bq/0LU6v8+0un/N8/n/y3M
5f8hx+P/FMLg/wm82/8CtNP/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wKz0/8JvNv/FMLg/yDH
4/8tzOX/ONDo/0HT6f9J1+v/Udnr/1jc7P9f3u3/ZOHt/2ni7v9u5e//dufw/4Hs8v+R8/f/ofn8/637
+/+u9PP/o+Lh/47Ix/91qqn/XY2M/0x0cv9AXVn/OEdC/zI1L/8wKSL/LyUc/zEmH/82LSf/Pjgz/0pH
Q/9cWlj/cnNx/4uNjP+jpqb/t7y8/8rOz//b39//6u3t//X4+P/7/v7//f////v////3/v7/9f39//P8
/P/y+/v/8fr6//D5+f/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+fn/8fr6//L7
+//z/Pz/9f39//f+/v/7/////f////v+/v/1+Pj/6u3t/9vf3//Kzs//t7y8/6Ompv+LjYz/cnNx/1xa
WP9KR0P/Pjgz/zYtJ/8xJh//LyUc/zApIv8yNS//OEdC/0BdWf9MdHL/XY2M/3Wqqf+OyMf/o+Lh/670
8/+t+/v/ofn8/5Hz9/+B7PL/dufw/27l7/9p4u7/ZOHt/1/e7f9Y3Oz/Udnr/0nX6/9B0+n/ONDo/y3M
5f8gx+P/FMLg/wm82/8Cs9P/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8Anbn/AKnH/wK00/8JvNv/E8Lg/yDH
4/8tzOX/OdDo/0TV6v9Q2ev/W93t/2Tg7v9r4+7/buTv/3Dl7/9z5u//eOjw/4Hs8/+Q8/j/n/n8/6r5
+/+q7+//nNfW/4S0sf9pjYr/UGpm/0BQTP82Pzn/MTMt/zAtJf8xKiL/Myoj/zcvKf8+ODP/SUVC/1hW
VP9tbWz/iIqJ/6Sop/++w8P/0djY/9/l5f/o7u//7vT1//L4+f/1/Pz/9v39//X8/P/z+/v/8vr6//H5
+f/x+fn/8Pn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pn5//H5
+f/x+fn/8vr6//P7+//1/Pz/9v39//X8/P/y+Pn/7vT1/+ju7//f5eX/0djY/77Dw/+kqKf/iIqJ/21t
bP9YVlT/SUVC/z44M/83Lyn/Myoj/zEqIv8wLSX/MTMt/zY/Of9AUEz/UGpm/2mNiv+EtLH/nNfW/6rv
7/+q+fv/n/n8/5Dz+P+B7PP/eOjw/3Pm7/9w5e//buTv/2vj7v9k4O7/W93t/1DZ6/9E1er/OdDo/y3M
5f8gx+P/E8Lg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRq/8Anbr/AarI/wS11P8Lvdz/FcPh/yHI
5P8tzOb/OtDo/0fW6v9U2+z/YeDt/2zk7/905u//d+jw/3jo8P956PD/fOnw/4Pr8v+O8fb/mfX5/6Dz
9v+e5uf/j8nJ/3ehnv9ddXH/RU9J/zc3MP8wKyP/Licf/y8oIP80LSX/OTMs/0A7Nv9KR0P/WFZU/2lo
aP+AgYH/nKCg/7q/v//T2tr/5ezs/+719f/x+Pn/8fj4//D4+P/x+Pj/8fn5//H4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+Pj/8fn5//H4+P/w+Pj/8fj4//H4+f/u9fX/5ezs/9Pa2v+6v7//nKCg/4CB
gf9paGj/WFZU/0pHQ/9AOzb/OTMs/zQtJf8vKCD/Licf/zArI/83NzD/RU9J/111cf93oZ7/j8nJ/57m
5/+g8/b/mfX5/47x9v+D6/L/fOnw/3no8P946PD/d+jw/3Tm7/9s5O//YeDt/1Tb7P9H1ur/OtDo/y3M
5v8hyOT/FcPh/wu93P8EtdT/AarI/wCduv8Akav/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AYeg/wOSrP8EoLv/B63K/wy51v8SwN7/GsXi/yTJ
5P8uzOb/OtDo/0fW6v9W2+z/ZOHu/3Dl7/956PD/furx/4Dr8v+B6/L/g+vx/4Xr8f+J7PP/jOzy/4zm
6/+G1tv/eLi7/2SQj/9PZWH/PUA6/zIqI/8tIhn/LiIa/zIoIf85Miv/Qjw3/01KRv9cWlj/bW1s/4CB
gf+Wmpr/sbW2/8vR0f/g6Oj/7/f3//X9/f/1/f3/8/v7//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/x+fn/8fn5//L6+v/y+vr/8vr6//L6+v/y+vr/8vr6//L6
+v/y+vr/8vr6//L6+v/y+vr/8vr6//L6+v/y+vr/8fn5//H5+f/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8/v7//X9/f/1/f3/7/f3/+Do6P/L0dH/sbW2/5aa
mv+AgYH/bW1s/1xaWP9NSkb/Qjw3/zkyK/8yKCH/LiIa/y0iGf8yKiP/PUA6/09lYf9kkI//eLi7/4bW
2/+M5uv/jOzy/4ns8/+F6/H/g+vx/4Hr8v+A6/L/furx/3no8P9w5e//ZOHu/1bb7P9H1ur/OtDo/y7M
5v8kyeT/GsXi/xLA3v8Mudb/B63K/wSgu/8Dkqz/AYeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/A4ig/waUrf8Lor3/EbHN/xa92f8cxOH/Isnk/yjL
5v8wzef/OdDo/0bV6v9V2+z/ZOHu/3Hl7/976fH/g+zy/4nu8/+M7/T/jO3y/4nq8P+D5u3/et/o/2/T
3f9lwcr/WaSr/0x/gv8/WVf/NTk0/zAnIP8vIRn/MSQd/zYtJ/8/OjX/TElF/15cWf9ycnH/iIqJ/5yg
oP+xtbb/xcvL/9jf3//o8PD/8vr6//b+/v/2/v7/8/v7//D5+f/w+Pj/7/j4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//L6+v/z+/v/9Pz8//T9/f/1/f3/9f7+//X+/v/2/v7/9v7///b+
///2/v//9v7///b+/v/1/v7/9f7+//X9/f/0/f3/9Pz8//P7+//y+vr/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4//D4+P/w+fn/8/v7//b+/v/2/v7/8vr6/+jw8P/Y39//xcvL/7G1
tv+coKD/iIqJ/3Jycf9eXFn/TElF/z86Nf82LSf/MSQd/y8hGf8wJyD/NTk0/z9ZV/9Mf4L/WaSr/2XB
yv9v093/et/o/4Pm7f+J6vD/jO3y/4zv9P+J7vP/g+zy/3vp8f9x5e//ZOHu/1Xb7P9G1er/OdDo/zDN
5/8oy+b/Isnk/xzE4f8Wvdn/EbHN/wuivf8GlK3/A4ig/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/BIih/wuVrv8Spb//G7XQ/yLC3P8nyeT/Kszn/y3N
5/8yzuf/OdDo/0XV6v9T2uz/Y+Dt/3Hl7/986fH/h+7z/5Hx9f+X8vX/lu/z/43o7v983ub/ZtDb/1G+
zP9Bqbj/OI+a/zJvdf8wUFD/MDcy/zEqIv8zJx//Nywl/z43Mv9JRkL/WlhW/3Fxb/+LjYz/pKin/7q/
v//L0dH/2N/f/+Tr6//s9PT/8vr6//T8/P/0/Pz/8vr6//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/7/j4//D4+P/w+Pj/8fn5//L6+v/z/Pz/9P39//X9/f/2/v7/9v7+//b////3////9/////f/
///3////9/////f////2////9v7+//b+/v/1/f3/9P39//P8/P/y+vr/8fn5//D4+P/w+Pj/7/j4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vr6//T8/P/0/Pz/8vr6/+z09P/k6+v/2N/f/8vR
0f+6v7//pKin/4uNjP9xcW//WlhW/0lGQv8+NzL/Nywl/zMnH/8xKiL/MDcy/zBQUP8yb3X/OI+a/0Gp
uP9Rvsz/ZtDb/3ze5v+N6O7/lu/z/5fy9f+R8fX/h+7z/3zp8f9x5e//Y+Dt/1Pa7P9F1er/OdDo/zLO
5/8tzef/Kszn/yfJ5P8iwtz/G7XQ/xKlv/8Lla7/BIih/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/BYmh/w6Xr/8ZqMH/I7nS/yzG3/8wzeb/MtDp/zPQ
6f820Oj/PNHo/0bV6v9T2uv/YuDt/3Dl7/996fH/i+/0/5jz9/+g9ff/n/L0/5Hn6/921t7/VsDN/zip
uv8kkqP/HXqI/x5gaP8kSEr/LDYy/zMuJ/85Lif/QDYx/0lEQP9XVVP/a2tq/4WHh/+jpqb/vsPD/9Pa
2v/g6Oj/6PDw/+z09P/u9vb/8Pj4//H5+f/x+fn/8fn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+fn/8fn5//H5+f/x+fn/8fn5//H5
+f/x+fn/8fn5//H5+f/x+fn/8fn5//D5+f/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//H5+f/x+fn/8Pj4/+729v/s9PT/6PDw/+Do
6P/T2tr/vsPD/6Ompv+Fh4f/a2tq/1dVU/9JRED/QDYx/zkuJ/8zLif/LDYy/yRISv8eYGj/HXqI/ySS
o/84qbr/VsDN/3bW3v+R5+v/n/L0/6D19/+Y8/f/i+/0/33p8f9w5e//YuDt/1Pa6/9G1er/PNHo/zbQ
6P8z0On/MtDp/zDN5v8sxt//I7nS/xmowf8Ol6//BYmh/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8AgZn/Bomh/xCYsP8dqsL/KbvU/zLJ4f840Oj/OdPr/zrT
6v880un/QdPp/0rX6v9W2+z/Y+Dt/3Dl7/996vH/jfD1/5z1+P+m9/n/pfP0/5Xl6P90ztb/TrK//yuW
p/8UfY//Dmd1/xJRWv8dP0H/KTQw/zUwKv9ANi//S0M+/1lUUf9qaWj/f4CA/5udnf+3vLz/0djY/+Xs
7P/v9/f/8vr6//L6+v/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+fn/8fn5//H5+f/w+Pj/7vX1/+vy8v/o7+//5ezs/+Pq6v/h6Oj/4Ofn/+Dm5v/f5uX/3+Xl/9/l
5P/f5eT/3+Xl/9/m5f/g5ub/4Ofn/+Ho6P/j6ur/5ezs/+jv7//r8vL/7vX1//D4+P/x+fn/8fn5//H5
+f/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/y+vr/8vr6/+/3
9//l7Oz/0djY/7e8vP+bnZ3/f4CA/2ppaP9ZVFH/S0M+/0A2L/81MCr/KTQw/x0/Qf8SUVr/Dmd1/xR9
j/8rlqf/TrK//3TO1v+V5ej/pfP0/6b3+f+c9fj/jfD1/33q8f9w5e//Y+Dt/1bb7P9K1+r/QdPp/zzS
6f860+r/OdPr/zjQ6P8yyeH/KbvU/x2qwv8QmLD/Bomh/wCBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xGYsP8eqsL/K7zU/zXK4v880un/QNXs/0PW
7P9G1ur/S9fq/1Pa6/9c3uz/ZuHu/3Hl7/996vH/jvH2/573+v+q+vv/qvX1/5nk5v94yM3/UKaw/yuF
kv8Tanj/DFRg/xBCSP8aNTb/KS8r/zcyK/9IPzj/W1NO/3Braf+FhIT/m5yc/7O2tv/Kz9D/3+Xl/+71
9f/1/f3/9v7+//T8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//L5
+f/0+/v/9v39//b9/f/0+vr/7fPz/+Pp6f/Z39//0NbW/8rPz//Fysr/wsfG/8DEw/++wsD/vcG//73A
vv+9wL7/vcG//77CwP/AxMP/wsfG/8XKyv/Kz8//0NbW/9nf3//j6en/7fPz//T6+v/2/f3/9v39//T7
+//y+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/0/Pz/9v7+//X9
/f/u9fX/3+Xl/8rP0P+ztrb/m5yc/4WEhP9wa2n/W1NO/0g/OP83Miv/KS8r/xo1Nv8QQkj/DFRg/xNq
eP8rhZL/UKaw/3jIzf+Z5Ob/qvX1/6r6+/+e9/r/jvH2/33q8f9x5e//ZuHu/1ze7P9T2uv/S9fq/0bW
6v9D1uz/QNXs/zzS6f81yuL/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xGYsP8eqsL/K7zU/zbL4v8/0+r/Rtft/0zZ
7f9S2uz/WNzs/17e7f9k4e3/auPu/3Lm7/996vH/jfH2/5/5/P+s/P3/rfb2/57i4/9+wcT/V5qg/zN1
fP8cV1//E0NJ/xQ0Nv8cLCr/KSwm/zo0Lf9SSUP/bWdi/4qGhP+kpKP/uru7/8zP0P/b4OH/6O7v//H4
+P/1/f3/9v7+//T8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//P6
+v/4/f3//P////z+/v/3+Pj/6uzs/9nb2//Gycn/tbm5/6mtrf+hpKP/m56c/5iZlv+VlZL/kpKP/5GR
jf+RkY3/kpKP/5WVkv+YmZb/m56c/6Gko/+pra3/tbm5/8bJyf/Z29v/6uzs//f4+P/8/v7//P////j9
/f/z+vr/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/0/Pz/9v7+//X9
/f/x+Pj/6O7v/9vg4f/Mz9D/uru7/6Sko/+KhoT/bWdi/1JJQ/86NC3/KSwm/xwsKv8UNDb/E0NJ/xxX
X/8zdXz/V5qg/37BxP+e4uP/rfb2/6z8/f+f+fz/jfH2/33q8f9y5u//auPu/2Th7f9e3u3/WNzs/1La
7P9M2e3/Rtft/z/T6v82y+L/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xCYsP8dqsL/KrzU/zbK4v9B1Or/S9nt/1Xd
7v9d3+3/ZeHu/2nj7v9s5O7/cOXv/3Xn8P996vH/jPH3/535/P+q/P3/rPX1/5/f3v+Curr/X4+P/z5m
Z/8oSEn/HTQ0/xsoJv8gJB//LCki/z44Mf9cVE7/gHp2/6Shn//DwsL/19jY/+Pm5//q7+//7vT1//H4
+P/z+/v/8/v7//L6+v/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//T6
+v/5/v7//f////3////19vb/4+Pk/8rLzP+wsbL/mJqa/4iJif98fXv/dHNw/25saP9qZ2L/Z2Ne/2Vi
XP9lYlz/Z2Ne/2pnYv9ubGj/dHNw/3x9e/+IiYn/mJqa/7Cxsv/Ky8z/4+Pk//X29v/9/////f////n+
/v/0+vr/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/y+vr/8/v7//P7
+//x+Pj/7vT1/+rv7//j5uf/19jY/8PCwv+koZ//gHp2/1xUTv8+ODH/LCki/yAkH/8bKCb/HTQ0/yhI
Sf8+Zmf/X4+P/4K6uv+f397/rPX1/6r8/f+d+fz/jPH3/33q8f915/D/cOXv/2zk7v9p4+7/ZeHu/13f
7f9V3e7/S9nt/0HU6v82yuL/KrzU/x2qwv8QmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8cqsL/KbvU/zXK4v9C1Or/T9vt/1zf
7/9n4u//b+Xv/3Pm7/915/D/dufw/3jo8P9/6vH/i/D2/5n2+v+j+Pr/pe/w/5nX1/+AsK//YoOB/0VZ
Vv8yOzb/Jykk/yMgGv8lIBn/Lyki/0M9Nv9lX1n/j4uH/7q3tf/b29r/7u/v//X4+f/1+vr/8vj5//D4
+P/w+Pj/8Pn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//P6
+v/4/f3/+/7+//n7+//u7+//2NjY/7q7u/+am5v/fn9//2tqaf9dW1n/U1BM/01IQv9IQjv/RD02/0I7
NP9COzT/RD02/0hCO/9NSEL/U1BM/11bWf9ramn/fn9//5qbm/+6u7v/2NjY/+7v7//5+/v/+/7+//j9
/f/z+vr/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pn5//D4
+P/w+Pj/8vj5//X6+v/1+Pn/7u/v/9vb2v+6t7X/j4uH/2VfWf9DPTb/Lyki/yUgGf8jIBr/Jykk/zI7
Nv9FWVb/YoOB/4Cwr/+Z19f/pe/w/6P4+v+Z9vr/i/D2/3/q8f946PD/dufw/3Xn8P9z5u//b+Xv/2fi
7/9c3+//T9vt/0LU6v81yuL/KbvU/xyqwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Udzu/2Dh
7/9s5O//defw/3rp8P996vH/furx/3/q8f+C6vH/ie3z/5Dw9f+U7vL/k+Pm/4jKzP9zo6P/W3d0/0VP
Sf82Myz/LSQc/ygeFv8qIRn/NS0m/0lDPf9taGP/mpaT/8bEw//o6ej/+vz8///////7////9fz8//H4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//L6+v/z+vr/8vn5//H3
9v/x9PT/7vDv/+bn5v/Y19b/wcC//6Oiof+Eg4L/aWhn/1ZUUv9IRUL/Pzo1/zgyK/8zLCT/Lycf/y0l
HP8tJRz/Lycf/zMsJP84Miv/Pzo1/0hFQv9WVFL/aWhn/4SDgv+joqH/wcC//9jX1v/m5+b/7vDv//H0
9P/x9/b/8vn5//P6+v/y+vr/8fn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+Pj/9fz8//v/////////+vz8/+jp6P/GxMP/mpaT/21oY/9JQz3/NS0m/yohGf8oHhb/LSQc/zYz
LP9FT0n/W3d0/3Ojo/+Iysz/k+Pm/5Tu8v+Q8PX/ie3z/4Lq8f9/6vH/furx/33q8f966fD/defw/2zk
7/9g4e//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Utzu/2Hh
7/9u5e//eOjw/3/r8f+E7fL/h+3z/4jt8v+I6/H/hunw/4Lm7f993ub/ddDY/2q3vf9ck5X/TGtq/z9H
Qv82Lyf/MCMb/y4gGP8wJh7/OjMt/09KRf9zb2v/npyZ/8rIx//s6+v//f7+///////8////9vz8//H4
+P/w+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/x+fn/9Pz8//j+/v/5////9vv7/+/z
8v/k5uX/19fV/8fFw/+0sq//npuY/4WCf/9saWf/V1RR/0dDP/87NjH/Miwm/ywlHv8nHxf/JBsT/yIZ
EP8iGRD/JBsT/ycfF/8sJR7/Miwm/zs2Mf9HQz//V1RR/2xpZ/+Fgn//npuY/7Syr//HxcP/19fV/+Tm
5f/v8/L/9vv7//n////4/v7/9Pz8//H5+f/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4//D4
+P/x+Pj/9vz8//z//////////f7+/+zr6//KyMf/npyZ/3Nva/9PSkX/OjMt/zAmHv8uIBj/MCMb/zYv
J/8/R0L/TGtq/1yTlf9qt73/ddDY/33e5v+C5u3/hunw/4jr8f+I7fL/h+3z/4Tt8v9/6/H/eOjw/27l
7/9h4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Utzu/2Dh
7/9u5e//eejw/4Ps8v+M7/T/kvH1/5Pw9P+P6/D/g+Tr/3PZ4/9hy9f/UrnG/0ihrP8/gYf/Ol9g/zZC
Pv80Lyf/MyYe/zMmHv83Lij/Qj04/1dTUP94d3T/oaGg/8rLyv/q7Oz/+v7+//7////7////9fz8//H4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/y+fn/9/39//z////+////+fn5/+rp
6P/U0tD/ure0/6CcmP+KhYH/dnFt/2VgW/9VUEv/R0I9/zw3Mf8zLSf/LSYf/yggGf8kHBT/IhkQ/yEY
D/8hGA//IhkQ/yQcFP8oIBn/LSYf/zMtJ/88NzH/R0I9/1VQS/9lYFv/dnFt/4qFgf+gnJj/ure0/9TS
0P/q6ej/+fn5//7////8////9/39//L5+f/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+Pj/9fz8//v////+////+v7+/+rs7P/Ky8r/oaGg/3h3dP9XU1D/Qj04/zcuKP8zJh7/MyYe/zQv
J/82Qj7/Ol9g/z+Bh/9Ioaz/UrnG/2HL1/9z2eP/g+Tr/4/r8P+T8PT/kvH1/4zv9P+D7PL/eejw/27l
7/9g4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Udzu/1/g
7/9t5O//eejw/4Xt8/+S8fX/m/T3/53y9f+V6+//gN7l/2TM2P9It8f/MqGy/yiKmf8lb3j/KFRX/y09
Ov8yLyn/Nisk/zovKP9BOTT/TUpH/2FgXv+AgYD/paen/8nNzf/l6+v/9fv7//n////3////8/v7//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/z+vr/+P7+//7/////////9/f3/+Hg
3//Bvrv/nJiU/3p1cP9hW1X/UUtF/0dBOv9BOjT/PDUv/zYwKf8yKyT/Lycg/ywkHP8qIhr/KSEY/ygg
F/8oIBf/KSEY/yoiGv8sJBz/Lycg/zIrJP82MCn/PDUv/0E6NP9HQTr/UUtF/2FbVf96dXD/nJiU/8G+
u//h4N//9/f3///////+////+P7+//P6+v/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8/v7//f////5////9fv7/+Xr6//Jzc3/paen/4CBgP9hYF7/TUpH/0E5NP86Lyj/Nisk/zIv
Kf8tPTr/KFRX/yVveP8oipn/MqGy/0i3x/9kzNj/gN7l/5Xr7/+d8vX/m/T3/5Lx9f+F7fP/eejw/23k
7/9f4O//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4ft8/+X8/f/ovb4/6X09v+a6+3/f9jf/1vAy/84pbX/HYye/xJ1hf8TXWn/G0hN/yc4
Nv8xMCr/OjEq/0M6NP9OSET/XVpZ/3FxcP+Njo7/rLCw/8vQ0P/j6ur/8fj4//X9/f/1/f3/8vr6//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H4+P/y+fn/9vz8//n9/f/3+fn/7Ozs/9LQ
z/+sqaX/gn14/1xWUP9DPDX/Ny8o/zMsJP80LSX/Ni8n/zYvKP82Lyj/NzAp/zgxKf85Mir/OjIq/zoy
Kv86Mir/OjIq/zkyKv84MSn/NzAp/zYvKP82Lyj/Ni8n/zQtJf8zLCT/Ny8o/0M8Nf9cVlD/gn14/6yp
pf/S0M//7Ozs//f5+f/5/f3/9vz8//L5+f/x+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8vr6//X9/f/1/f3/8fj4/+Pq6v/L0ND/rLCw/42Ojv9xcXD/XVpZ/05IRP9DOjT/OjEq/zEw
Kv8nODb/G0hN/xNdaf8SdYX/HYye/ziltf9bwMv/f9jf/5rr7f+l9Pb/ovb4/5fz9/+H7fP/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4ju9P+Z9Pj/pfj6/6j19v+d6ev/gNLX/1q0vv8zlKL/F3iI/wxicP8OTlf/Fz5B/yUz
Mf8zMSv/QDgx/1BHQf9hW1j/dHJx/4iJif+go6P/ur6//9LY2P/l7Oz/8Pj4//T8/P/z/Pz/8fn5//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//L5+f/z+/v/9Pv7//P6+v/x9/b/7/Pz/+vt7P/i4uH/0tDP/7e0
sf+Sjon/a2Vf/0lCO/80LCT/KyMb/ysjG/8vKCH/Ni8o/zs0Lv9COzX/SUM8/1BJQ/9VT0j/WFJL/1pT
Tf9aU03/WFJL/1VPSP9QSUP/SUM8/0I7Nf87NC7/Ni8o/y8oIf8rIxv/KyMb/zQsJP9JQjv/a2Vf/5KO
if+3tLH/0tDP/+Li4f/r7ez/7/Pz//H39v/z+vr/9Pv7//P7+//y+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8fn5//P8/P/0/Pz/8Pj4/+Xs7P/S2Nj/ur6//6Cjo/+IiYn/dHJx/2FbWP9QR0H/QDgx/zMx
K/8lMzH/Fz5B/w5OV/8MYnD/F3iI/zOUov9atL7/gNLX/53p6/+o9fb/pfj6/5n0+P+I7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4nu9P+Z9fn/pvn7/6r29v+f5+j/g8zP/16pr/84hI3/HWVw/xFQWf8RPkT/GDMz/yUu
Kv81Miv/SEA6/2BYU/95dHH/kZCP/6enp/+6vb3/zdHR/9zi4v/o8PD/7/j4//L7+//y+/v/8fn5//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//T7+//4/v7/+v////j9/f/x9PT/5Obl/9TU0//BwL3/rKml/5KO
if90bmn/Vk9I/z01Lf8tJR3/KCAZ/yojHP8yKyX/OzYw/0ZBO/9UT0r/ZF9a/3Nuaf9+eXT/hH97/4iD
fv+Ig37/hH97/355dP9zbmn/ZF9a/1RPSv9GQTv/OzYw/zIrJf8qIxz/KCAZ/y0lHf89NS3/Vk9I/3Ru
af+Sjon/rKml/8HAvf/U1NP/5Obl//H09P/4/f3/+v////j+/v/0+/v/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8fn5//L7+//y+/v/7/j4/+jw8P/c4uL/zdHR/7q9vf+np6f/kZCP/3l0cf9gWFP/SEA6/zUy
K/8lLir/GDMz/xE+RP8RUFn/HWVw/ziEjf9eqa//g8zP/5/n6P+q9vb/pvn7/5n1+f+J7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9P+Z9vn/pfr8/6n19v+g5eX/h8bH/2SeoP9Cdnn/KFVY/xw/Qv8YMTH/HSkm/ycq
JP84Myz/UElC/3BpZP+RjYr/sK+t/8bHx//W2Nj/4OTl/+ft7f/s8/P/8Pj4//H6+v/x+fn/8Pn5//D4
+P/w+Pj/8Pj4/+/4+P/w+Pj/8fn5//b8/P/8//////////v8/P/u7ez/19XT/7q3tP+dmJX/gn14/2tl
X/9WT0j/RDw0/zYuJv8uJh7/LSUe/zErJP85NC//RUE9/1VRTv9rZ2T/g4B9/5qWk/+rqKX/tbGu/7m2
s/+5trP/tbGu/6uopf+alpP/g4B9/2tnZP9VUU7/RUE9/zk0L/8xKyT/LSUe/y4mHv82Lib/RDw0/1ZP
SP9rZV//gn14/52Ylf+6t7T/19XT/+7t7P/7/Pz///////z////2/Pz/8fn5//D4+P/v+Pj/8Pj4//D4
+P/w+Pj/8Pn5//H5+f/x+vr/8Pj4/+zz8//n7e3/4OTl/9bY2P/Gx8f/sK+t/5GNiv9waWT/UElC/zgz
LP8nKiT/HSkm/xgxMf8cP0L/KFVY/0J2ef9knqD/h8bH/6Dl5f+p9fb/pfr8/5n2+f+I7/T/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+Y9vr/pPr8/6j19v+h4+P/isHA/2uVlP9Mamj/M0dE/ycyL/8hJSH/ISEb/yom
H/86NC3/V1BJ/314c/+no6D/ysnI/+Li4v/t7/D/8fX1//D29v/v9vb/8Pj4//D5+f/w+fn/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//b9/f/8//////////n7+//m5+b/x8XD/6Cdmf96dXD/XFZQ/0lC
O/89NS3/Ni4m/zMrI/8zKyT/NS8o/zs2Mf9FQj7/VFFP/2dmZP+CgYD/oZ+e/728u//T0dD/393c/+Xk
4v/l5OL/393c/9PR0P+9vLv/oZ+e/4KBgP9nZmT/VFFP/0VCPv87NjH/NS8o/zMrJP8zKyP/Ni4m/z01
Lf9JQjv/XFZQ/3p1cP+gnZn/x8XD/+bn5v/5+/v///////z////2/f3/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D5+f/w+fn/8Pj4/+/29v/w9vb/8fX1/+3v8P/i4uL/ysnI/6ejoP99eHP/V1BJ/zo0
Lf8qJh//ISEb/yElIf8nMi//M0dE/0xqaP9rlZT/isHA/6Hj4/+o9fb/pPr8/5j2+v+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9vv/o/r9/6j19v+h4uH/jL27/2+Pi/9RYVz/Oj03/y0pIf8lHRb/JBwT/ysj
G/88NC3/W1VO/4aBff+0sa7/29vZ//P09P/8////+/////b8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//T6+v/3/Pz/9/r6/+7v7//Y19b/tLKv/4qFgf9hW1X/Qzw1/zQs
JP8tJR3/LiYe/zMrJP84MSv/Pzo0/0lFQf9VU1H/ZmVk/3t8e/+YmZn/uLm5/9bX1v/s7e3/+fr5////
////////+fr5/+zt7f/W19b/uLm5/5iZmf97fHv/ZmVk/1VTUf9JRUH/Pzo0/zgxK/8zKyT/LiYe/y0l
Hf80LCT/Qzw1/2FbVf+KhYH/tLKv/9jX1v/u7+//9/r6//f8/P/0+vr/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/2/Pz/+/////z////z9PT/29vZ/7Sxrv+GgX3/W1VO/zw0
Lf8rIxv/JBwT/yUdFv8tKSH/Oj03/1FhXP9vj4v/jL27/6Hi4f+o9fb/o/r9/5f2+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GMiP9UXVf/PTkx/y8kG/8nGhH/JRkQ/ywi
Gv88NS3/XFZQ/4mEgP+4tbP/4eDe//n6+f////////////r////1/Pz/8/v7//P7+//z+/v/8/v7//P7
+//z/Pz/9Pz8//T8/f/z+/v/8fj4/+/19f/s8PH/5ejo/9jZ2f/BwL//npuY/3Zxbf9RS0T/Ny8o/ysj
G/8oIBn/LSUe/zUvKP8/OjT/S0dD/1pYVf9ra2n/fn9//5SWlv+usLD/ysvL/+Pk5P/29vb/////////
//////////////b29v/j5OT/ysvL/66wsP+Ulpb/fn9//2traf9aWFX/S0dD/z86NP81Lyj/LSUe/ygg
Gf8rIxv/Ny8o/1FLRP92cW3/npuY/8HAv//Y2dn/5ejo/+zw8f/v9fX/8fj4//P7+//0/P3/9Pz8//P8
/P/z+/v/8/v7//P7+//z+/v/8/v7//X8/P/6///////////////5+vn/4eDe/7i1s/+JhID/XFZQ/zw1
Lf8sIhr/JRkQ/ycaEf8vJBv/PTkx/1RdV/9xjIj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jbu4/3GMh/9UXVb/PTgw/zAjGv8nGRD/JRkQ/ywi
Gf88NS3/XFZQ/4mEgP+4tbL/4eDe//n6+v////////////3////4////9v////b////2////9v////b/
///3////+P////n////3////8fn5/+ju7//c4eH/zdDQ/7u7u/+joqH/hYJ//2RfW/9HQTr/Mywk/ysj
G/8qIxz/MSsk/zs2Mf9JRUH/WlhV/25ubP+Fh4b/m56e/7CztP/FyMj/2dzc/+vs7P/4+fn/////////
//////////////j5+f/r7Oz/2dzc/8XIyP+ws7T/m56e/4WHhv9ubmz/WlhV/0lFQf87NjH/MSsk/yoj
HP8rIxv/Mywk/0dBOv9kX1v/hYJ//6Oiof+7u7v/zdDQ/9zh4f/o7u//8fn5//f////5////+P////f/
///2////9v////b////2////9v////j////9///////////////5+vr/4eDe/7i1sv+JhID/XFZQ/zw1
Lf8sIhn/JRkQ/ycZEP8wIxr/PTgw/1RdVv9xjIf/jbu4/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GNiP9TXlf/PDkx/y8kHP8nGhH/JRkQ/ywi
Gv88NS3/XFZQ/4iEgP+3tbL/4ODe//j6+v////////////z////3////9v////b+///2/v//9v7///b/
///3////+f////n////2////7fX1/93k5P/Jzs7/srW1/5ucnP+Eg4L/bGlm/1VQS/9BOjT/NC0l/y8o
If8yKyX/OTQv/0VCPv9VU1H/a2tp/4WHhv+go6P/uL29/8vQ0f/a4OD/5evs/+709P/1+/v/+v////z/
///8////+v////X7+//u9PT/5evs/9rg4P/L0NH/uL29/6Cjo/+Fh4b/a2tp/1VTUf9FQj7/OTQv/zIr
Jf8vKCH/NC0l/0E6NP9VUEv/bGlm/4SDgv+bnJz/srW1/8nOzv/d5OT/7fX1//b////5////+f////f/
///2////9v7///b+///2/v//9v////f////8///////////////4+vr/4ODe/7e1sv+IhID/XFZQ/zw1
Lf8sIhr/JRkQ/ycaEf8vJBz/PDkx/1NeV/9xjYj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3CNif9TX1n/PDoz/y8mHv8nGxP/JRoS/ywi
Gv87NC3/WVRO/4KAfP+usK3/1NjX/+vy8f/0/Pz/9f39//L5+f/u9vb/7fX1/+319f/t9fX/7fX1/+31
9f/v9/f/8fn5//L6+v/u9vX/4urp/87U1P+0uLj/mJqa/35/fv9paGf/V1RR/0dCPf88NS//Ni8n/zYv
KP87NjD/RUE9/1RRT/9mZWT/fn9//5uenv+4vb3/0dfX/+Ho6P/q8fH/7vX1//D39//x+Pj/8/r6//T7
+//0+/v/8/r6//H4+P/w9/f/7vX1/+rx8f/h6Oj/0dfX/7i9vf+bnp7/fn9//2ZlZP9UUU//RUE9/zs2
MP82Lyj/Ni8n/zw1L/9HQj3/V1RR/2loZ/9+f37/mJqa/7S4uP/O1NT/4urp/+729f/y+vr/8fn5/+/3
9//t9fX/7fX1/+319f/t9fX/7fX1/+729v/y+fn/9f39//T8/P/r8vH/1NjX/66wrf+CgHz/WVRO/zs0
Lf8sIhr/JRoS/ycbE/8vJh7/PDoz/1NfWf9wjYn/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8mHv8nHBT/JhsT/ywj
G/86Myv/VE9I/3h2cf+en5z/v8PB/9Ta2P/d4+L/3uTj/9vh4P/Y3t3/2N7d/9je3f/Y3t3/2N7d/9je
3f/Z397/3OLh/9zi4f/Y3t3/zdLR/7i8u/+doJ//gYKB/2hoZv9WVFL/R0RA/z03Mv83MCn/Ni8o/zs0
Lv9GQTv/VVFO/2dmZP97fHv/lJaW/7C0tP/L0NH/4ejo/+729v/z+/v/9Pz8//L6+v/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/y+vr/9Pz8//P7+//u9vb/4ejo/8vQ0f+wtLT/lJaW/3t8e/9nZmT/VVFO/0ZB
O/87NC7/Ni8o/zcwKf89NzL/R0RA/1ZUUv9oaGb/gYKB/52gn/+4vLv/zdLR/9je3f/c4uH/3OLh/9nf
3v/Y3t3/2N7d/9je3f/Y3t3/2N7d/9je3f/b4eD/3uTj/93j4v/U2tj/v8PB/56fnP94dnH/VE9I/zoz
K/8sIxv/JhsT/yccFP8vJh7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8mHv8oHRX/Jx0U/y0k
G/84MCn/TEZA/2hlX/+GhYH/oKGe/7CzsP+3urj/uLu5/7a5tv+ztrT/s7a0/7O2tP+ztrT/s7a0/7O2
tP+0t7X/trm3/7e6t/+0t7T/qqyq/5iamP+CgoD/ampn/1ZUUv9IRUH/PTg0/zUvKf8zLCX/Ni8o/0I7
Nf9UT0r/a2dk/4KBgP+YmZn/r7Gy/8XKyv/a4OD/6vHx//P7+//2////9f7+//L7+//w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+/v/9f7+//b////z+/v/6vHx/9rg4P/Fysr/r7Gy/5iZmf+CgYD/a2dk/1RP
Sv9COzX/Ni8o/zMsJf81Lyn/PTg0/0hFQf9WVFL/ampn/4KCgP+Ympj/qqyq/7S3tP+3urf/trm3/7S3
tf+ztrT/s7a0/7O2tP+ztrT/s7a0/7O2tP+2ubb/uLu5/7e6uP+ws7D/oKGe/4aFgf9oZV//TEZA/zgw
Kf8tJBv/Jx0U/ygdFf8vJh7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8nH/8pHhb/KR4W/y0k
HP81Lib/Qzw1/1VRSv9pZmH/enl0/4WFgP+KioX/ioqG/4mJhP+Ih4P/iIeD/4iHg/+Ih4P/iIeD/4iH
g/+IiIP/iomF/4qKhf+Ih4P/gYB8/3V0b/9mY1//VlNO/0hEQP8+OTT/NjAq/zApI/8wKSH/NzAp/0lD
PP9kX1r/g4B9/6Gfnv+4ubn/y83O/9re3v/l6+z/7vX1//T8/P/1/v7/9Pz8//L6+v/w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+vr/9Pz8//X+/v/0/Pz/7vX1/+Xr7P/a3t7/y83O/7i5uf+hn57/g4B9/2Rf
Wv9JQzz/NzAp/zApIf8wKSP/NjAq/z45NP9IRED/VlNO/2ZjX/91dG//gYB8/4iHg/+KioX/iomF/4iI
g/+Ih4P/iIeD/4iHg/+Ih4P/iIeD/4iHg/+JiYT/ioqG/4qKhf+FhYD/enl0/2lmYf9VUUr/Qzw1/zUu
Jv8tJBz/KR4W/ykeFv8vJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8nH/8qHxf/KyAY/y4l
Hf8zKyP/OjMr/0M9Nv9OSEL/V1JM/1xYUv9fW1X/X1tV/19aVP9eWlT/XlpT/15aU/9eWlP/XlpT/15a
U/9eWlT/X1tV/19bVf9eWlT/WlZQ/1RQSv9MR0H/RD84/z03Mf83MSv/MSoj/y0lHv8uJh//ODEp/1BJ
Q/9zbmn/mpaT/728u//W19b/5Obn/+vw8P/u9PT/8Pf3//L6+v/y+/v/8vr6//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8vr6//L7+//y+vr/8Pf3/+709P/r8PD/5Obn/9bX1v+9vLv/mpaT/3Nu
af9QSUP/ODEp/y4mH/8tJR7/MSoj/zcxK/89NzH/RD84/0xHQf9UUEr/WlZQ/15aVP9fW1X/X1tV/15a
VP9eWlP/XlpT/15aU/9eWlP/XlpT/15aVP9fWlT/X1tV/19bVf9cWFL/V1JM/05IQv9DPTb/OjMr/zMr
I/8uJR3/KyAY/yofF/8vJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8rIBj/LCEZ/y4m
Hf8xKSH/Mysj/zYvJ/85Mir/PDUu/z43MP8/ODD/Pzgw/z44MP8+NzD/Pjcw/z43MP8+NzD/Pjcw/z43
MP8+NzD/Pjgw/z44MP8+NzD/PTYv/zs0Lf85Miv/Ny8o/zUtJv8yKyP/LSYe/yoiGv8tJR3/OTIq/1VP
SP9+eXT/q6il/9PR0P/s7e3/9/r6//n9/f/1+/v/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//X7+//5/f3/9/r6/+zt7f/T0dD/q6il/355
dP9VT0j/OTIq/y0lHf8qIhr/LSYe/zIrI/81LSb/Ny8o/zkyK/87NC3/PTYv/z43MP8+ODD/Pjgw/z43
MP8+NzD/Pjcw/z43MP8+NzD/Pjcw/z43MP8+ODD/Pzgw/z84MP8+NzD/PDUu/zkyKv82Lyf/Mysj/zEp
If8uJh3/LCEZ/ysgGP8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKCD/MCcf/y8nHv8vJh3/LyYd/y8mHP8vJRz/LiUc/y8lHP8vJRz/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJRz/LyUc/y4lHP8vJRz/LyYc/y8mHf8vJh3/MCce/zAnH/8vJx7/KyMa/ykgGP8sIxv/OTIq/1hR
Sv+Dfnn/s6+s/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+s/4N+
ef9YUUr/OTIq/ywjG/8pIBj/KyMa/y8nHv8wJx//MCce/y8mHf8vJh3/LyYc/y8lHP8uJRz/LyUc/y8l
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8lHP8vJRz/LiUc/y8lHP8vJhz/LyYd/y8mHf8vJx7/MCcf/zAo
IP8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wJx//LyYd/y4kGv8sIhf/KyAU/ysfE/8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8qHxL/Kh8S/yof
Ev8qHxL/Kh8S/yofEv8qHxL/KyAT/ywhFf8tIhf/LiQZ/y8lG/8vJRv/KyIY/ykgFv8sIxv/OTIq/1hR
S/+Dfnn/s6+t/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+t/4N+
ef9YUUv/OTIq/ywjG/8pIBb/KyIY/y8lG/8vJRv/LiQZ/y0iF/8sIRX/KyAT/yofEv8qHxL/Kh8S/yof
Ev8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8rHxP/KyAU/ywiF/8uJBr/LyYd/zAn
H/8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKB//LyYd/y4lGv8uIxf/LSEU/ywgE/8sIBL/LCAS/ywgEv8sIBL/LCAT/ywgE/8sIBP/LCAT/ywg
E/8sIBL/LCAS/ywgEv8sIBL/LSET/y0iFf8uIxf/LyUZ/zAmG/8vJhv/LCIY/ykgFv8sIxv/OjIq/1hR
S/+Dfnn/s6+t/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+t/4N+
ef9YUUv/OjIq/ywjG/8pIBb/LCIY/y8mG/8wJhv/LyUZ/y4jF/8tIhX/LSET/ywgEv8sIBL/LCAS/ywg
Ev8sIBP/LCAT/ywgE/8sIBP/LCAT/ywgEv8sIBL/LCAS/ywgEv8sIBP/LSEU/y4jF/8uJRr/LyYd/zAo
H/8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKCD/MCgf/y8nHv8vJh3/LyYd/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHf8vJx3/MCce/zAnH/8vJx7/KyMa/ykgGP8sIxv/OjIq/1hR
Sv+Dfnn/s6+s/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+s/4N+
ef9YUUr/OjIq/ywjG/8pIBj/KyMa/y8nHv8wJx//MCce/y8nHf8vJh3/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYd/y8mHf8vJx7/MCgf/zAo
IP8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRj/LCIZ/y8m
Hf8wKCH/Lykj/y4qJ/8uKyr/LSwt/y0sL/8sLDD/LCww/ywsMP8sLC//LCwv/ywsL/8sLC//LCwv/yws
L/8sLC//LCww/ywsMP8sLC//LCwu/ywrLf8sKir/LCko/ywoJv8sJyP/KSMe/ycgGv8rJB3/OTEq/1VP
SP9+eXT/q6il/9PR0P/s7e3/9/r6//n9/f/1+/v/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//X7+//5/f3/9/r6/+zt7f/T0dD/q6il/355
dP9VT0j/OTEq/yskHf8nIRr/KSMe/ywnI/8tKCb/LCko/ywqKv8sKy3/LCwu/ywsL/8sLDD/LCww/yws
L/8sLC//LCwv/ywsL/8sLC//LCwv/ywsL/8sLDD/LCww/ywsMP8tLC//LSwt/y4rKv8uKif/Lykj/zAo
If8vJh3/LCIZ/ywhGP8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIBf/LSEY/y8m
Hf8vKSP/Lisr/ysuNv8oMUH/JjRL/yU2Uf8kNlT/JDZU/yQ2U/8lNVL/JTVS/yU1Uv8lNVL/JTVS/yU1
Uv8lNlL/JTZT/yU2U/8lNVL/JDRO/yMxSP8iLUD/Iio4/yInMf8jJSv/IiEj/yMgHv8pIx//NzAp/1BK
Q/90bmn/mpeT/728u//W19b/5Obn/+vw8P/u9PT/8Pf3//L6+v/y+/v/8vr6//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8vr6//L7+//y+vr/8Pf3/+709P/r8PD/5Obn/9bX1v+9vLv/mpeT/3Ru
af9QSkP/NzAp/yokH/8lIR7/JCMk/yUnK/8lKTH/JCw4/yQvQf8kMkj/JTRO/yU1Uv8lNlP/JTZT/yU1
Uv8lNVL/JTVS/yU1Uv8lNVL/JTVS/yU1Uv8kNlP/JDZU/yQ2VP8lNlH/JjRL/ygxQf8rLjb/Lisr/y8p
I/8vJh3/LSEY/ywgF/8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIBb/LSEW/y8l
HP8vKib/Ky41/yc0Sv8iOmD/HT9z/xtDfv8ZRIP/GUOD/xpDgf8aQn//GkJ//xpCf/8aQn//GkJ//xpC
f/8aQoD/GkOB/xpDgf8aQn//GT95/xg5bf8WMl3/FCtN/xQlP/8WIjX/GR8q/x4fI/8mIyH/NC4p/0pD
PP9mYFr/hIB9/6Ggnv+4ubn/y83O/9re3v/l6+z/7vX1//T8/P/1/v7/9Pz8//L6+v/w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+vr/9Pz8//X+/v/0/Pz/7vX1/+Xr7P/a3t7/y83O/7i5uf+hoJ7/hIB9/2Vg
Wv9KQzz/NS8p/yglIv8hIiT/HiMr/xwnNv8aKkH/GS9O/xk1Xv8aO23/Gj95/xpCf/8aQoH/GkKB/xpC
gP8aQn//GkJ//xpCf/8aQn//GkJ//xpCf/8aQ4H/GUOD/xlEg/8bQ37/HT9z/yI6YP8nNEr/Ky41/y8q
Jv8vJRz/LSEW/ywgFv8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnHv8sIBX/LSAU/y8l
G/8uKij/KTE//yI5Xv8aQn//FEqb/xBPrf8OUbT/DlG0/w9Qsf8PT6//D06u/w9Orv8PTq7/D06u/w9O
rv8PT6//D1Cx/w9Qsv8PTq//Dkql/w1ClP8KOH3/CS9m/wknUf8NIkH/EyA0/xogKv8lJCX/Mi0o/0M8
Nf9XUEr/bGhk/4OBgP+YmZn/r7Gy/8XKyv/a4OD/6vHx//P7+//2////9f7+//L7+//w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+/v/9f7+//b////z+/v/6vHx/9rg4P/Fysr/r7Gy/5iZmf+DgYD/bGhk/1ZQ
Sv9CPDX/Mi0o/yclJf8eIyr/GCQ1/xMnQ/8QLFL/DjNn/w47fv8PRJT/D0ul/w9Or/8PULL/D0+x/w9P
r/8PTq7/D06u/w9Orv8PTq7/D06u/w9Pr/8PULH/DlG0/w5RtP8QT63/FEqb/xpCf/8iOV7/KTE//y4q
KP8vJRv/LSAU/ywgFf8wJx7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnHv8tHxT/LiAT/y8l
G/8uKyv/JzJH/x49bv8USJf/DFG7/wdX0f8FWtv/BVrc/wVa2f8GWdb/BlnW/wZZ1v8GWdb/BlnW/wZZ
1v8GWdf/Blra/wZb2v8GWdb/BlXL/wZNtv8GQpv/Bjd//wkvZv8NKVL/FCZA/xwlMv8mJir/MCwo/zw1
Lv9JQjv/V1NO/2hmZP97fHv/lJaW/7C0tP/L0NH/4ejo/+729v/z+/v/9Pz8//L6+v/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/y+vr/9Pz8//P7+//u9vb/4ejo/8vQ0f+wtLT/lJaW/3t8e/9oZmT/V1NO/0lC
O/88NS7/MCso/yUmKf8bJDL/EiVA/wsoUf8HLWX/BTZ//wVBm/8FTLb/BlXL/wZZ1v8GW9r/Blra/wZZ
1/8GWdb/BlnW/wZZ1v8GWdb/BlnW/wZZ1v8FWtn/BVrc/wVa2/8HV9H/DFG7/xRIl/8ePW7/JzJH/y4r
K/8vJRv/LiAT/y0fFP8wJx7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3CNif9TX1n/PDoz/zAnHv8tHxP/LiAS/y8l
Gv8tKyz/JjJK/xw9df8RSKL/CFLK/wJY4/8AXO7/AF7x/wBe7/8BX+3/AV/t/wFf7f8BX+3/AV/t/wFf
7f8AYO//AGDx/wBg8v8AX+7/Alzi/wdXzv8MULT/EkiX/xhBff8dO2b/IjRR/yYvPf8qKy//MCsn/zcw
KP8+NzD/SEM+/1RST/9mZWT/fn9//5uenv+4vb3/0dfX/+Ho6P/q8fH/7vX1//D39//x+Pj/8/r6//T7
+//0+/v/8/r6//H4+P/w9/f/7vX1/+rx8f/h6Oj/0dfX/7i9vf+bnp7/fn9//2ZlZP9VUk//SUM+/0A5
MP84MCj/Lyon/yQnLv8aJTv/DyZN/wcqYv8CL3n/ADmU/wBFsf8AUcz/AVri/wFf7v8BYfL/AWHx/wFg
7/8BX+3/AV/t/wFf7f8BX+3/AV/t/wFf7f8AXu//AF7x/wBc7v8CWOP/CFLK/xFIov8cPXX/JjJK/y0r
LP8vJRr/LiAS/y0fE/8wJx7/PDoz/1NfWf9wjYn/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GNiP9TXlf/PDkx/zEmHP8tHhL/Lh8R/zAl
Gv8tKiz/JjFK/xs5df8QQqL/B0vK/wFS5P8AV/H/AFv2/wBe9v8AYPX/AGL2/wBi9/8AYvf/AGL3/wBi
9v8AYfj/AGD5/wBg+v8AX/f/Bl/t/xJh3f8hYsn/MGOx/ztgmf8/WYH/PU1l/zc+Sv8yMTT/Lyol/zEp
If81LSX/PDYv/0ZCP/9VU1H/a2tp/4WHhv+go6P/uL29/8vQ0f/a4OD/5evs/+709P/1+/v/+v////z/
///8////+v////X7+//u9PT/5evs/9rg4P/L0NH/uL29/6Cjo/+FhoX/a2pp/1VTUf9HQz//Pzkw/zoy
Jv82LSL/Lyol/yUnMf8aJ0X/EChc/wcsdv8BMo7/ADyo/wBIwv8AVNr/AF3s/wBi9/8AZPv/AGP6/wBi
+P8AYvf/AGL3/wBi9/8AYvf/AGL2/wBg9f8AXvb/AFv2/wBX8f8BUuT/B0vK/xBCov8bOXX/JjFK/y0q
LP8wJRr/Lh8R/y0eEv8xJhz/PDkx/1NeV/9xjYj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jbu4/3GMh/9UXVb/PTgw/zElG/8uHhH/Lx8R/zAl
Gv8tKiv/Ji5I/xszcP8QOpv/B0DB/wFH2/8ATen/AFTw/wBa8/8AX/X/AGL3/wBj+P8AY/j/AGL3/wBi
9/8AYPj/AF75/wBd+f8AXvf/C2Hx/yBr5/88eNv/VoLL/2eGt/9qfp7/YGp9/05RWf88Ojr/MCok/ywk
G/8tJRz/Mywl/zw3Mf9JRUH/WlhV/25ubP+Fh4b/m56e/7CztP/FyMj/2dzc/+vs7P/4+fn/////////
//////////////j5+f/r7Oz/2dzc/8XIyP+ws7T/m56e/4WHhv9ubmz/WVdV/0lFQf8+OTL/OTEm/zct
Hv80Kh3/Lykk/yYoNf8bKE//ECpt/wcui/8BNKT/AD66/wBJz/8AVeH/AF3v/wBi9/8AZPr/AGP6/wBi
+P8AYvf/AGL3/wBj+P8AY/j/AGL3/wBf9f8AWvP/AFTw/wBN6f8BR9v/B0DB/xA6m/8bM3D/Ji5I/y0q
K/8wJRr/Lx8R/y4eEf8xJRv/PTgw/1RdVv9xjIf/jbu4/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GMiP9UXVf/PTkx/zElHP8uHxL/LiAS/zAl
Gv8tKSr/JitE/xstaP8QMI//BzWy/wE7y/8AQ9v/AEzl/wBW6/8AXfD/AGHz/wBi9f8AYvX/AGH0/wBh
8/8AX/T/AF30/wBc9P8AXvP/D2bw/y537v9Wjur/e6Hi/5Sr1P+Worr/hImV/2dna/9KRUT/NC4o/ywk
G/8qIhn/Lice/zYvKP8/OjT/S0dD/1pYVf9ra2n/fn9//5SWlv+usLD/ysvL/+Pk5P/29vb/////////
//////////////b29v/j5OT/ysvL/66wsP+Ulpb/fn9//2traf9ZWFX/S0dD/z86NP84MSn/NSwg/zQq
G/8zKRz/Likm/yYpPf8bK1z/EC1//wcyoP8BOLj/AEHL/wBL2v8AVeX/AF3u/wBh8/8AYvX/AGL1/wBh
9P8AYfP/AGH0/wBi9P8AYvX/AGHz/wBd8P8AVuv/AEzl/wBD2/8BO8v/BzWy/xAwj/8bLWj/JitE/y0p
Kv8wJRr/LiAS/y4fEv8xJRz/PTkx/1RdV/9xjIj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9vv/o/r9/6j19v+h4uH/jL27/2+Pi/9RYVz/Oj03/y8qIv8sIxf/LSMW/y8m
HP8tKCn/JihA/xwoYP8RKYP/Byyj/wEyu/8AO83/AEba/wBS5P8AW+v/AGDw/wBi8v8AYfL/AGHx/wBg
8P8AYPD/AF/w/wBf8f8GZPH/GW/w/z+G8/9uovX/mrz0/7fI6v+5wNL/o6Ss/4B9f/9bVlT/QDo0/zMr
JP8uJh3/LyYe/zMrJP84MSv/Pzo0/0lFQf9VU1H/ZmVk/3t8e/+YmZn/uLm5/9bX1v/s7e3/+fr5////
////////+fr5/+zt7f/W19b/uLm5/5iZmf97fHv/ZmVk/1VTUf9JRUH/Pzo0/zgxK/8zKyT/MSgf/zEo
Hv8vKCP/LCox/yQrSv8aLmz/DzKR/wY2sv8BPMn/AETY/wBN4v8AVuj/AFzt/wBg8P8AYfL/AGHx/wBg
8f8AYPD/AGHx/wBi8v8AYvL/AGDw/wBb6/8AUuT/AEba/wA7zf8BMrv/Byyj/xEpg/8cKGD/JihA/y0o
Kf8vJhz/LSMW/ywjF/8vKiL/Oj03/1FhXP9vj4v/jL27/6Hi4f+o9fb/o/r9/5f2+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/13g
7/9r5O//eOjw/4fv9f+X9vr/pPr8/6j19v+h4+P/isHA/2uVlP9Mamj/M0dE/ygzL/8mKiL/Kigd/y0p
IP8tKSn/Jic8/xwmWP8RJXf/ByiV/wEtrf8AN8H/AETR/wBQ3/8AWun/AGDw/wBh8v8AYfL/AGDx/wJh
8P8GZPD/C2fx/xNs8f8hdPL/N4Lz/1ya+P+Jtf3/sc7+/8za9v/O0+L/ubnA/5iVl/90b2//WFJP/0dA
Ov88NS3/Ni4m/zQsI/80LCT/NzAp/z04Mv9HQz//VVJP/2hmZP+DgYD/oaCe/728u//T0dD/393c/+Xj
4v/l4+L/393c/9PR0P+9vLv/oaCe/4OBgP9oZmT/VVJP/0dDP/8+OTL/ODEp/zMrJP8vKCL/LSYk/ysn
Kv8qKTX/JixG/x8vYP8WMoH/DTek/wU8wv8BQtb/AEni/wBR6f8AWOz/AF3u/wBg8P8AYfH/AGHx/wBg
8P8AYPD/AGHx/wBi8v8AYvL/AGDw/wBa6f8AUN//AETR/wA3wf8BLa3/ByiV/xEld/8cJlj/Jic8/y0p
Kf8tKSD/Kigd/yYqIv8oMy//M0dE/0xqaP9rlZT/isHA/6Hj4/+o9fb/pPr8/5j2+v+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9C1Or/T9vt/1zg
7/9p5O//dujw/4bu9P+X9vn/pPn7/6n19v+g5eX/h8bH/2WeoP9Cdnn/KFVY/x1AQv8dNTL/JC8o/yss
Jf8sKSn/JiY4/xwkT/8RJGr/ByaF/wEsnf8ANrP/AEPI/wBQ2v8AWuf/AGDw/wBh8/8AYPP/AGDx/wVj
8P8RavH/IXTy/zWB8/9Lj/T/ZJ72/4Sz+v+myf//xdv//9jk+//Z3+z/ysvS/7Gvs/+VkpP/fHd2/2hi
Xv9WTkf/Rj40/zsxJv80Kx//Myof/zYuJf89NzD/SEM+/1dTTv9saGT/hIB9/5qXk/+rqKX/tbGu/7m2
s/+5trP/tbGu/6uopf+al5P/hIB9/2xoZP9XU07/SUM+/z85MP85MSb/NSwg/zEoH/8tJiT/KSYv/yUo
Pv8iK1H/HS5m/xczf/8QOJv/Cj63/wREz/8BSt//AE/o/wBV7f8AWu7/AF7v/wBg8P8AYfH/AGHw/wBg
8P8AYPD/AGHx/wBi8/8AYvP/AGDw/wBa5/8AUNr/AEPI/wA2s/8BLJ3/ByaF/xEkav8cJE//JiY4/ywp
Kf8rLCX/JC8o/x01Mv8dQEL/KFVY/0J2ef9knqD/h8bH/6Dl5f+p9fb/pfr8/5n2+f+I7/T/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zXK4v9C1Or/Ttvt/1vg
7/9o4+//defw/4Xu9P+X9fj/pPn7/6n29v+f5+j/g8zP/16pr/84hI3/HWVw/xJQWf8VQkT/Hjc0/ygw
K/8rKin/JiYz/x0kRf8RJFz/ByZ1/wEsjP8ANqX/AEO9/wBQ1P8AWub/AF/w/wBg8/8AX/P/AF/x/wdl
8P8ccfL/OYPz/1mX9f95q/f/k7z5/6zL/P/C2f//0+T//93o/f/e5fP/1trk/8jJ0f+2tbr/op+i/4yH
h/9ya2f/WFBI/0M5Lv82LB//MSca/zIpHf83Lyb/Pzgw/0lCO/9WUEr/ZWBa/3Ruaf9+eXT/hH97/4eC
fv+Hgn7/hH97/355dP90bmn/ZWBa/1ZQSv9JQjv/QDkw/zoyJv83LR7/NCob/zEoHv8rJyr/JSg+/x8q
V/8ZLnL/EzKK/w43oP8KPrb/BkbK/wJM2v8AUub/AFbs/wBa7/8AXO//AF/v/wBg8P8AYfD/AGDw/wBg
8P8AYPD/AGHx/wBi8/8AYvT/AGDw/wBa5v8AUNT/AEO9/wA2pf8BLIz/ByZ1/xEkXP8dJEX/JiYz/ysq
Kf8oMCv/Hjc0/xVCRP8SUFn/HWVw/ziEjf9eqa//g8zP/5/n6P+q9vb/pvn7/5n1+f+J7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9C1Or/UNvu/13g
7/9q5O//d+jw/4fu8/+Y9Pj/pfj6/6j19v+d6ev/gNLX/1q0vv80lKL/F3iI/w1icP8RUFf/HEFB/yc1
Mf8rLCr/JiYu/x0jO/8RJE7/Bydl/wEtfP8AN5b/AESz/wBQzv8AWuT/AF/w/wBf9P8AXvT/AF/x/wpm
8f8ld/L/S4/0/3Wp9/+cwfn/uNL7/8re/f/V5f7/3On+/97q/f/f6Pj/3eTz/9fd6//N0d7/vsDL/6am
rf+GhIb/ZWBe/0hBO/82LST/LiUb/y4lHP8yKiH/NzAo/zw1Lv9CPDX/SkM8/1BKQ/9VT0j/WFJL/1pT
Tf9aU03/WFJL/1VPSP9QSkP/SkM8/0I8Nf88NS7/ODAo/zYtIv80Kh3/Mykc/y8oI/8qKTX/IitR/xku
cv8RMZL/Cjar/wY9v/8ERc7/Ak3a/wFU4/8AWer/AFzu/wBe8P8AX/D/AF/w/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9P8AYvT/AGDw/wBa5P8AUM7/AESz/wA3lv8BLXz/Bydl/xEkTv8dIzv/JiYu/yss
Kv8nNTH/HEFB/xFQV/8NYnD/F3iI/zOUov9atL7/gNLX/53p6/+o9fb/pfj6/5n0+P+I7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/w+YsP8bqcL/KLvU/zbK4v9E1er/U9zu/2Ph
7/9y5fD/gOnx/43u9P+b9Pf/pff5/6b19v+a6+3/f9jf/1u/y/83pbX/HYye/xN1hf8WX2n/H0tN/yg5
Nv8sLSr/JyYq/x4jMv8UJEL/CihW/wQtbP8BN4n/AESq/wBRyf8AW+L/AF/w/wBf9f8AXfT/AF7y/wpm
8f8oefL/UpP1/4Cv9/+oyfr/xNr7/9Tk/P/c6f3/3ur9/97q/P/e6fz/3un9/9vm/P/T3vb/xM/m/6y0
yf+KkKD/Z2h0/0dGTP8yLzL/KSUm/ygjIv8rJiT/Lion/zArKP8yLSj/NS8p/zcwKf85MSr/OjIq/zoy
Kv86Mir/OjIq/zkxKv83MCn/NS8p/zItKP8wKyj/Lyon/y8qJf8vKST/Likm/ywqMf8mLEb/HS5m/xMy
iv8KNqv/BDzF/wFC1v8ASuD/AFPm/wBZ6v8AXu7/AGDw/wBg8f8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9P8AYvX/AGDw/wBb4v8AUcn/AESq/wE3if8ELWz/CihW/xQkQv8eIzL/JyYq/ywt
Kv8oOTb/H0tN/xZfaf8TdYX/HYye/ziltf9bwMv/f9jf/5rr7f+l9Pb/ovb4/5fz9/+H7fP/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8AgZn/Bomh/w6XsP8ZqcL/JrvT/zTK4v9G1er/Wt3v/2/j
8f+C6PL/kOzz/5rw9f+h9Pf/o/X4/6Dz9f+U6+//ft3l/2PM1/9Ht8f/MqGy/yiKmf8ncHj/KlVX/y4+
Ov8uLSn/KSQk/yEhKf8YIzb/ECdI/wsuX/8HOH7/BESj/wJRxv8BW+L/AGDx/wBg9/8AXvX/AF/y/wlm
8f8kdvL/SY30/3Gm9v+Xvvn/ss/6/8Xb+//T4/z/2+j9/97q/f/e6v7/2Oj//8/i///B2P//r8fz/5at
2f94i7T/WGaL/zxGZv8qMEv/ISY8/x8jNP8hJDH/JCYu/yUmKf8nJST/KSQg/yokHf8sIxr/LSMY/y0j
F/8tIxf/LSMY/ywjGv8qJB3/KSQg/yclJP8lJin/JScu/yUnMf8mKDX/Jik9/yQrSv8fL2D/FzN//w83
oP8HPb//AkLW/wBJ4/8AUOr/AFft/wBd7v8AYPD/AGLx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9v8AYvf/AGHx/wFb4v8CUcb/BESj/wc4fv8LLl//ECdI/xgjNv8hISn/KSQk/y4t
Kf8uPjr/KlVX/ydweP8oipn/MqGy/0i3x/9kzNj/gN7l/5Xr7/+d8vX/m/T3/5Lx9f+F7fP/eejw/23k
7/9f4O//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6V/wB+lf8AgZn/Bomh/w2XsP8WqMH/I7rT/zLJ4f9H1er/Yt7w/37m
8v+W6/T/pu/1/6vy9v+o9Pf/ofP2/5fw9P+M6/D/f+Pq/2/Z4/9fy9f/UrnG/0ihrP9Bgof/O2Bg/zdC
Pv8xLSf/KyIf/yUfIP8fISr/GSc6/xQuUf8POHP/CkWc/wVSxP8CXOP/AGH0/wBh+f8AYPf/AGDz/wdk
8f8acPH/NIDz/1KT9f9wpvb/i7b4/6XH+f++1vv/0eL8/9zp/f/b6P7/zeH//7fV//+exP//hrD2/2+Y
4v9We8X/P16k/yxEhf8eMm3/Fyhc/xYlT/8XJUT/GSU7/xskMf8eIij/IiEg/yYgGf8pHxT/Kh4R/yse
D/8rHg//Kh4R/ykfFP8mIBn/IiEg/x4iKP8bJDH/GiU7/xonRf8aKFD/Gytd/xoubP8WMoH/ETib/ws+
tv8FRc7/AUrg/wBQ6v8AVu7/AFvw/wBe8P8AYfH/AGLx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHz/wBj+P8AY/n/AGH0/wJc4/8FUsT/CkWc/w84c/8ULlH/GSc6/x8hKv8lHyD/KyIf/zEt
J/83Qj7/O2Bg/0GCh/9Ioaz/UrnG/2HL1/9z2eP/g+Tr/4/r8P+T8PT/kvH1/4zv9P+D7PL/eejw/27l
7/9g4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6V/wB+lf8AgZn/BYmh/wyXsP8VqMH/IrrT/zPK4f9M1uv/beDx/5Dp
9P+t7/b/vfP4/731+P+x9Pf/oPH2/5Du8/+G6vD/gejv/37l7f963ub/dNDY/2q3vf9dlJX/Tmxq/z9I
Qv80Lif/LSIb/ykeGf8mISD/Iicv/x0uRv8XOGn/D0WV/wlSwP8DXOL/AGH0/wBi+v8AYfj/AGDz/wRj
8f8OafH/HHLx/y588/9DifT/W5n1/32u9/+ixfn/wtn7/9Xl/P/T5P3/vNf+/5rC/v90qvv/VpP0/0B+
5v8waNP/I1O8/xlBpv8SNJL/Dix//wwobf8NJ1z/DyZN/xMkP/8YIzP/HyIn/yYiHv8rIRf/LSET/y8h
Ef8vIRH/LSET/yshF/8mIh7/HyIn/xgjM/8TJD//DyZN/w4oXf8PKm7/Dy1//w8ykf8NN6T/Cj63/wZG
yv8DTdr/AVPm/wBX7f8AW/D/AF3w/wBf8P8AYfH/AGHx/wBh8f8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHz/wBj+P8AY/r/AGL0/wNc4v8JUsD/D0WV/xc4af8dLkb/Iicv/yYhIP8pHhn/LSIb/zQu
J/8/SEL/TWxq/1yTlf9qt73/ddDY/33e5v+C5u3/hunw/4jr8f+I7fL/h+3z/4Tt8v9/6/H/eOjw/27l
7/9h4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/w6XsP8YqcL/JrvU/zrL4v9W2Oz/e+Py/6Ls
9v/B8vj/0fb6/833+f+69Pj/ovD1/47s8/+F6/H/hu3z/43v9f+T7vL/k+Pm/4jKzP90pKP/XHh0/0VP
Sf81Miz/LSQc/ysgFv8rIhr/Kicm/yYtPP8eN2D/FUSM/wtQuP8EWtz/AGDv/wBh9v8AYfb/AGDy/wJh
8P8EY/D/B2Xw/w5o8f8acPL/MH7z/1aW9f+Fs/j/r836/8jc/P/F2/z/p8n7/3yu+f9Okfb/K3jw/xhm
6P8PV93/C0rR/wk/wv8HN7L/BTGf/wQti/8FK3X/Byli/wsoUv8TJ0P/HCc2/yUnLP8sJyT/MCcf/zEn
HP8xJxz/MCcf/ywnJP8lJyz/HCc2/xMnQ/8LKFL/Bypi/wUsdv8FLov/BjKg/wY2sv8FPML/BETP/wNM
2v8BVOP/AFnq/wBd7v8AXvD/AF/w/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9v8AYvb/AGDv/wRa3P8LULj/FUSM/x43YP8mLTz/Kicm/ysiGv8rIBb/LSQc/zUy
LP9FT0n/XHh0/3Sko/+Iysz/k+Pm/5Tu8v+Q8PX/ie3z/4Lq8f9/6vH/furx/33q8f966fD/defw/2zk
7/9g4e//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/CImh/xOZsP8iq8P/NL7V/0rP5P9n3O7/jOb0/7Hv
+P/P9fr/3vj7/9j4+v/D9fj/qvH1/5Xt8/+M7PP/kfH2/5v3+/+k+Pr/pe/w/5jX1/9/sK//YYOB/0VZ
Vv8yOzb/Kisk/yklGv8sJRr/Ligi/yotNP8iNVb/GECA/w1Mq/8FVc7/AFvj/wBe7f8AX+//AF/v/wBg
7/8AX/D/AF7w/wBe8P8DYvD/Fm7x/zuF8/9rovb/lr35/7DO+v+tzPr/j7r5/2Ke9/8zgfT/EWnv/wFa
6/8AT+b/AEff/wBC1v8BPMn/ADi4/wA0o/8AMY3/ATB5/wYuaP8OLln/GC5N/yEuQv8oLjr/LC41/y4u
M/8uLjP/LC41/yguOv8hLkL/GC5N/w4uWf8GLmj/ATB5/wAyjf8ANKP/ADi4/wE8yf8BQtb/AUrf/wBS
5v8AWer/AF7u/wBg8P8AYfH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg
8P8AYO//AF/v/wBf7/8AXu3/AFvj/wVVzv8NTKv/GECA/yI1Vv8qLTT/Ligi/ywlGv8pJRr/Kisk/zI7
Nv9FWVb/YoOB/4Cwr/+Z19f/pe/w/6P4+v+Z9vr/i/D2/3/q8f946PD/dufw/3Xn8P9z5u//b+Xv/2fi
7/9c3+//T9vt/0LU6v81yuL/KbvU/xyqwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyU/wB8lP8Bf5f/DImg/x6asP80rsT/TcTX/2fV5/+D4vH/ouv3/8Hy
+v/Z9/v/5Pn8/9/5+//O9vn/uPL3/6Xv9f+e8PX/ofX5/6n7/f+v/f7/rfX1/53e3v9/ubn/XY6P/z1m
Z/8oSEn/ITY0/yMtJv8pKiD/Lioi/ywsL/8kMkv/GTpw/w5El/8FTLj/AFLN/wBX2/8AW+T/AF7q/wBg
7v8AX/H/AFzx/wBa8f8AXPD/DmXx/y158v9TkfX/dqj3/4y2+P+Jtfj/cKX3/0yO9f8mdfL/C2Lw/wBW
7f8AT+v/AEvo/wBH4v8ARNj/AEDK/wA+uP8AO6b/ADqV/wQ4hv8LOHr/Ezhv/xo4Zv8gOGD/Izhb/yQ4
Wf8kOFn/Izhb/yA4YP8aOGb/Ezhv/ws4ev8EOIb/ADqV/wA7pv8APbj/AEDK/wBE2P8ASeL/AE/o/wBW
7P8AXO7/AGDw/wBi8f8AYvH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYfH/AGHy/wBh
8f8AYO7/AF7q/wBb5P8AV9v/AFLN/wVMuP8ORJf/GTpw/yQyS/8sLC//Lioi/ykqIP8jLSb/ITY0/yhI
Sf8+Zmf/X4+P/4K6uv+f397/rPX1/6r8/f+d+fz/jPH3/33q8f915/D/cOXv/2zk7v9p4+7/ZeHu/13f
7f9V3e7/S9nt/0HU6v82yuL/KrzU/x2qwv8QmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8Bfpb/EYig/yqbsf9Ks8b/a8rb/4nd6/+j6vX/u/H6/9D2
/P/f+Pz/5/r8/+P5/P/Y9/r/yfX5/7zz9/+18/f/tfj7/7f9/v+3/v7/r/b2/5rh4v95wMP/U5qf/zF0
fP8cWF//FkVJ/xs4Nv8kMSr/LC0m/ywsLf8lLkH/GjNe/w46f/8FQZz/AEiz/wBPxv8AVtb/AFvj/wBf
7f8AYPL/AF7z/wBc8v8AXPD/CmLw/x9v8f85gfP/UZH1/2Cb9f9emvX/TY/1/zR+8/8abfH/B2Dw/wBY
7v8AU+3/AFHs/wBP6P8ATeL/AEvY/wBJzP8AR7//AEaz/wNFqf8HRaD/DUWY/xJFkv8WRY3/GEWK/xlF
if8ZRYn/GEWK/xZFjf8SRZL/DUWY/wdFoP8DRan/AEaz/wBHv/8ASMz/AEvY/wBN4v8AUen/AFXt/wBa
7/8AXvD/AGDx/wBh8f8AYfH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfL/AGLz/wBi
8v8AYO3/AFvj/wBV1v8AT8b/AEiz/wVBnP8OOn//GjNe/yUuQf8sLC3/LC0m/yQxKv8bODb/FkVJ/xxY
X/8zdXz/V5qg/37BxP+e4uP/rfb2/6z8/f+f+fz/jfH2/33q8f9y5u//auPu/2Th7f9e3u3/WNzs/1La
7P9M2e3/Rtft/z/T6v82y+L/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8Cfpf/FYqh/zefs/9guMn/idLe/6zl7//D8fj/0/f8/975
/f/k+fz/5/n8/+b5/P/h+fv/2vj7/9P3+v/M9/r/yfr8/8X9/v+9/f3/r/X2/5bj5f9zx83/TKWv/ymF
kv8Tanj/DlZg/xVFSf8gOTb/KjAr/ysrK/8kKjf/GixN/w4wZv8FNoD/AD2X/wBGr/8AUMf/AFjc/wBe
6/8AYfL/AGD0/wBf8/8AXvH/BWHw/xFp8f8fcvL/LHvy/zSA8/8zf/P/Knny/xxx8v8OZ/H/BGDw/wBc
7/8AWe//AFju/wBX7P8AVuj/AFTj/wBT3P8AUtX/AFLP/wJRyf8EUcT/B1HA/wpRvf8MUbr/DVG5/w1R
uP8NUbj/DVG5/wxRuv8KUb3/B1HA/wRRxP8CUcn/AFLP/wBS1f8AU9z/AFTj/wBW6P8AWOz/AFru/wBc
7/8AX/D/AGDw/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfP/AGL0/wBi
8v8AX+v/AFjc/wBPx/8ARq//AD2X/wU2gP8OMGb/GixN/yQqN/8rKyv/KjAr/yA5Nv8VRUn/DlZg/xNq
eP8rhZL/UKaw/3jHzf+Z5Ob/qvX1/6r6+/+e9/r/jvH2/33q8f9x5e//ZuHu/1ze7P9T2uv/S9fq/0bW
6v9D1uz/QNXs/zzS6f81yuL/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB/l/8HhJv/H5Cm/0WmuP90v83/otni/8fs8v/b9/v/5fv+/+f7
/v/n+v3/5/n8/+j6/P/o+vz/6Pr8/+X6/P/f+vz/2fz9/9D+/v/E/Pz/svX2/5fl6f9zztb/TLK//yqW
p/8UfY//D2d1/xVTWv8gQUH/KTQw/ysqKv8kJi//GiY9/w8pUf8GLmf/ATR+/wA+m/8ASrn/AFTU/wBc
5/8AYPH/AGH0/wBg8/8AYPH/AmHw/wZj8P8KZvH/D2nx/xJr8f8Ra/H/Dmnx/wpm8f8FY/D/AWHw/wBf
8P8AXu//AF3v/wBd7v8AXO3/AFzr/wBc6f8AW+b/AFvk/wFb4/8BW+H/Alvg/wNb3/8EW97/BFvd/wVb
3f8FW93/BFvd/wRb3v8DW9//Alvg/wFb4f8BW+P/AFvk/wBb5v8AXOn/AFzr/wBc7f8AXe7/AF7v/wBf
7/8AX/D/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfP/AGH0/wBg
8f8AXOf/AFTU/wBKuf8APpv/ATR+/wYuZ/8PKVH/GiY9/yQmL/8rKir/KTQw/yBBQf8VU1r/D2d1/xR9
j/8rlqf/TrK//3TO1v+V5ej/pfP0/6b3+f+c9fj/jfD1/33q8f9w5e//Y+Dt/1bb7P9K1+r/QdPp/zzS
6f860+r/OdPr/zjQ6P8yyeH/KbvU/x2qwv8QmLD/Bomh/wCBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8Afpf/AH+X/wOBmf8Fgpr/CYSb/xGIn/8gkKX/Op2w/2Cxwf+MydT/tt/m/9fw9f/o+fz/7fz//+z8
/v/p+v3/6Pn8/+r6/P/s+v3/7vv9/+78/f/q/P3/4/39/9r+/v/M/Pz/uvb3/6Hp7f9/19//WsHO/zqp
uv8lkqT/HXqI/x9haP8mSUr/LDYy/yspJ/8lIyf/HSIw/xMkQP8LKVP/Bi9s/wQ5i/8CRK3/AU/N/wBX
4/8AXO//AF7z/wBf8v8AX/D/AF/w/wBf8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg8f8AYPH/AGDx/wBg
8f8AYPH/AGDx/wBg8f8AYPH/AGDx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYPH/AGDx/wBg8f8AX/P/AF70/wBc
7/8AV+P/AU/M/wJErf8EOYv/Bi9r/wspU/8TJED/HCIw/yUjJ/8rKSf/LDYy/ydKSv8gYWj/HnqI/ySS
o/84qbr/VsDN/3bW3v+R5+v/n/L0/6D19/+Y8/f/i+/0/33p8f9w5e//YuDt/1Pa6/9G1er/PNHo/zbQ
6P8z0On/MtDp/zDN5v8sxt//I7nS/xmowf8Ol6//BYmh/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8Ae5T/AH2V/waAmP8Rhp3/H42j/zGXq/9Ho7T/YbHA/4LCzv+l1N3/xubs/97z9v/r+vz/7/z+/+z7
/v/p+v3/6Pn8/+r6/P/u+/3/8fz9//H8/f/v/f3/6f3+/+L+/v/W/Pz/x/j4/7Hu8v+U4un/dNLd/1e/
zf9Cqrj/No+a/zJwdf8wUVD/Lzcy/ywnIv8mHx7/IB4k/xkhMf8UJ0T/Dyxc/wo1fv8GP6P/A0nG/wFQ
4P8AVe3/AFjy/wBa8v8AW/D/AFzw/wBc8P8AXPD/AFzw/wBb8P8AXPD/AF3w/wBe8P8AX/D/AGDw/wBg
8P8AYfD/AGHx/wBh8f8AYfH/AGLy/wBi8/8AYvT/AGL1/wBi9f8AYvb/AGL2/wBi9/8AYvf/AGL3/wBi
9/8AYvf/AGL3/wBi9/8AYvf/AGL2/wBi9v8AYvX/AGL1/wBi9P8AYvP/AGLy/wBh8f8AYfH/AGHx/wBh
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHx/wBh8v8AYfP/AGHz/wBf8/8AXfT/AFr0/wBW
7v8BUOD/A0jG/wY/o/8KNX7/Dyxc/xQnRP8ZITH/IB4k/yYfHv8sJyL/MDcy/zJRUP80cHX/OY+a/0Gp
uP9Rvsz/ZtDb/3ze5v+N6O7/lu/z/5fy9f+R8fX/h+7z/3zp8f9x5e//Y+Dt/1Pa7P9F1er/OdDo/zLO
5/8tzef/Kszn/yfJ5P8iwtz/G7XQ/xKlv/8Lla7/BIih/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeJH/AHuU/wqBmf8di6H/N5ms/1Wpuf90ucb/jsfR/6fU3f++4ef/0uzx/+H0+P/p+fz/6/r9/+r6
/f/o+fz/6Pn8/+r6/P/t+/3/8Pz9//H8/f/w/P3/7f3+/+j9/v/g/P3/1Pn6/8P09v+t7fL/k+Pr/3vV
3v9mwcv/VqSr/0l/gf8+WVf/NTk0/y0lH/8oHRj/JB0b/yEhJv8dJjf/GCtP/xIycv8MOpr/BkG//wJI
2v8ATen/AFLv/wBW8P8AWe//AFvw/wBc8P8AXPD/AFzw/wBc8P8AXPD/AF3w/wBe8P8AX/D/AGDw/wBg
8P8AYfD/AGHw/wBh8f8AYfH/AGHy/wBh8/8AYvP/AGL0/wBi9f8AYvX/AGL1/wBi9v8AYvb/AGL2/wBi
9v8AYvb/AGL2/wBi9v8AYvb/AGL1/wBi9f8AYvX/AGL0/wBi8/8AYfP/AGHy/wBh8f8AYfH/AGHw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPH/AGHy/wBi8/8AYvT/AGH0/wBe9P8AWvT/AFXx/wBP
6v8CSNr/BkG//ww5mv8SMnL/GCtP/x0mN/8hISb/JB0b/ygdGP8tJR//NTk0/0BaV/9NgIL/WaSr/2XB
yv9v093/et/o/4Pm7f+J6vD/jO3y/4zv9P+J7vP/g+zy/3vp8f9x5e//ZOHu/1Xb7P9G1er/OdDo/zDN
5/8oy+b/Isnk/xzE4f8Wvdn/EbHN/wuivf8GlK3/A4ig/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeZL/AH2W/w6FnP8pk6f/TqW2/3e6x/+dztf/t9zi/8jl6v/T7PD/2/H1/+D1+f/l+Pv/5/n8/+f5
/P/n+fz/5/n8/+n6/P/s+/3/7vv9/+/8/f/v/P3/7v39/+39/f/p/P3/4fv7/9X4+v/F9vn/svL2/57p
7f+K19v/dri6/2GPj/9NZWH/PEA6/zAqI/8rIBj/KR8X/ygjH/8mJy7/IStF/xkvZ/8QNY7/CDq0/wJA
0P8AR+H/AE3p/wBU7P8AWe7/AF3v/wBf8f8AX/H/AF/w/wBf8P8AX/D/AF/w/wBf8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBh8f8AYfH/AGHx/wBh8v8AYfL/AGHy/wBh8v8AYfL/AGHy/wBh
8v8AYfL/AGHy/wBh8v8AYfL/AGHy/wBh8v8AYfL/AGHx/wBh8f8AYfH/AGDx/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHx/wBi8v8AYvL/AGDx/wBc7/8AVu7/AE/q/wBH
4f8CQdD/CDq0/xA1jv8ZL2f/IStF/yYnLv8oIx//KR8X/ysgGP8wKiP/PUA6/09lYf9lkI//eLi7/4bW
2/+M5uv/jOzy/4ns8/+F6/H/g+vx/4Hr8v+A6/L/furx/3no8P9w5e//ZOHu/1bb7P9H1ur/OtDo/y7M
5v8kyeT/GsXi/xLA3v8Mudb/B63K/wSgu/8Dkqz/AYeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8CgZn/C4Wc/x2Oo/88nrD/ZbLA/5PJ0v+73eP/1Oru/9/x9P/i9Pf/4fX4/+H1+f/i9/r/5Pj7/+X4
/P/m+fz/5/n8/+n6/P/r+vz/7Pv9/+77/f/u/P3/7/z9//D8/f/u/P3/6vz8/+L7/f/X/f7/yv3+/7r3
+P+n5+j/kMnJ/3agnv9cdXH/RU9J/zY3MP8wKiH/LiYb/y4nHv8tKSj/Jyo7/x4sWv8UMH//DDSj/wY7
wP8EQ9L/Bk3e/wlY5f8LYer/DGbv/wpn8f8HZvH/BGPx/wFh8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYO//AGDu/wBg7f8AX+v/AFzn/wBX4/8AUOD/AEja/wJB
0P8FOr//DDWk/xUwgP8fLVv/Jyo7/y0pKP8uJx7/LiYb/zAqIf82NzD/RU9J/111cf94oZ7/j8nJ/57m
5/+g8/b/mfX5/47x9v+D6/L/fOnw/3no8P946PD/d+jw/3Tm7/9s5O//YeDt/1Tb7P9H1ur/OtDo/y3M
5v8hyOT/FcPh/wu93P8EtdT/AarI/wCduv8Akav/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8olKj/MZir/0Cgsv9crr3/gsDM/6rV3P/O5+r/4vHz/+n2+P/p9/n/5fb5/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+n6/P/q+vz/6/v9/+z7/f/u+/3/7/z9//H8/f/x/P3/7/z9/+r9/v/k////2////8/+
/v++8vH/ptjW/4m0sv9sjYr/Umpm/0BRS/84QDj/NDUp/zMuIv8wKiT/Kicw/yEmSf8XKGj/EC2I/w01
o/8QQbj/GVLK/yJj2f8qceX/K3jt/yR28f8acPL/D2jx/wVi8P8AX/D/AF7x/wBf8f8AYPH/AGHy/wBh
8v8AYfH/AGHx/wBh8f8AYfH/AGHw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHw/wBh8f8AYfH/AGHx/wBh
8f8AYfL/AGHy/wBh8v8AYfP/AGHz/wBh8v8AX+//AF7q/wBb4/8AWNz/AFTU/wFPzP8DSMb/BUG//wg6
tP8MNaT/EjCK/xorav8jKEr/Kygx/zAqJP8zLiL/NTUp/zhAOP9AUUv/UGpm/2mNiv+EtLH/nNfW/6rv
7/+q+fv/n/n8/5Dz+P+B7PP/eOjw/3Pm7/9w5e//buTv/2vj7v9k4O7/W93t/1DZ6/9E1er/OdDo/y3M
5f8gx+P/E8Lg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP9gsL7/ZrPB/3G4xf+Gws3/odDY/77f5P/Y7O//5vP1/+v3+P/p9/n/5fb6/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+j5/P/p+vz/6vr8/+v7/f/s+/3/7vv9//D7/f/x/P3/8Pz9/+79/v/s////6P///9//
///R9/f/uuTj/5zJyP99q6r/YY2M/010cv9CXlj/O0lA/zY4Lf8xKyP/KiMm/yEfNP8ZIEv/FCVk/xUv
ff8gQZb/Mlqw/0Z0yf9TiN3/VZDr/0mM8v80f/P/HXDy/wpj8f8AXfH/AFzy/wBd8/8AYPT/AGH0/wBi
9P8AYvT/AGLz/wBi8v8AYvL/AGHx/wBh8f8AYfD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBh8P8AYfH/AGHx/wBi8v8AYvL/AGLz/wBi
8/8AYvT/AGL0/wBi9v8AY/j/AGP4/wBi9v8AX+//AFvk/wBV1v8AT8f/AUq5/wNErf8HP6P/Czma/xA1
jv8VMID/Gitq/yAmUP8mIzj/LCQn/zIrI/83OC3/PElA/0JdWP9NdHL/XY2M/3Sqqf+OyMf/o+Lh/670
8/+t+/v/ofn8/5Hz9/+B7PL/dufw/27l7/9p4u7/ZOHt/1/e7f9Y3Oz/Udnr/0nX6/9B0+n/ONDo/y3M
5f8gx+P/FMLg/wm82/8Cs9P/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP+Xy9T/m83W/6HQ2P+t1t3/vd7j/87m6v/d7vD/5fP0/+f19//m9vj/4/b5/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+j5/P/o+vz/6fr8/+n6/P/q+vz/7Pv9/+77/f/v+/3/8Pz9//D9/v/w////7////+r/
///e+vr/ye7u/6zd3v+Oycv/cbK1/1ybnP9Nfn3/QmBb/zpEPP8zLif/KyEg/yMbJP8dGzH/GyFD/yEt
Wf8zRHX/UGWW/2yHuf+Bodb/g6vq/3Cj8v9QkPT/LXny/xBm8f8BXfH/AFvy/wBc8/8AX/T/AGH0/wBi
9P8AYvT/AGLz/wBi8v8AYvL/AGHx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBh8f8AYfH/AGHx/wBi8v8AYvL/AGLz/wBi
9P8AYvT/AGL1/wBi9/8AY/n/AGP6/wBi9v8AXu3/AFfb/wBPxv8ARq//AT6b/wU5i/8LNX7/EjJy/xkv
Z/8fLVv/IyhK/yYjOP8pICj/LSMh/zMvJ/86RDz/Q2Bb/05+ff9bmpz/a7K0/3/Iyv+U29z/pevr/671
9f+r+fr/oPf5/5Hx9v+B6/L/defw/2vj7v9h4O3/Wd3s/1La6/9L1+r/R9bq/0LU6v8+0un/N8/n/y3M
5f8hx+P/FMLg/wm82/8CtNP/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP++3+T/v9/l/8Ph5v/I4+j/z+fr/9fr7v/e7vH/4vHz/+Pz9f/i9Pf/4vX4/+H2+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/o+fz/6Pn8/+j5/P/p+vz/6vr8/+z7/f/u+/3/7/z9//D9/f/y/v7/8v///+/+
/v/l+/v/0fX2/7fu8P+b4+f/gNPY/2q9wf9ZnZ//S3h2/z9UT/82ODL/Ligj/ygfHv8lHiP/JyUv/zEz
Qv9KTV7/bXOF/5Garf+puNH/q8Po/5K48v9ooPX/O4Ty/xVt8P8BYfD/AFzw/wBc8P8AXvD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBh8f8AYfT/AGL0/wBg7/8AW+P/AFLN/wBIs/8APZf/ATR+/wYva/8OLFz/GCtP/yEr
Rf8nKjv/Kygx/ywkJ/8tIyH/MCkj/zY4Mv9AVVD/TXh2/1udn/9pvcH/eNLX/4jh5f+Y6+7/pPHy/6r1
9v+n9vf/nfT3/5Dw9P+B6/L/dOfw/2ji7v9c3uz/UNnr/0fW6v9B0+n/PtLp/zzS6f870en/Ns/n/y3M
5v8hyOP/FcPg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP/E4ub/xeLn/8jj6P/M5ur/0ujs/9jr7v/e7vH/4fHz/+Ly9f/i9Pf/4fX4/+H2+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6vr8/+z7/f/t+/3/7vz9/+/8/f/v/f3/7/39/+v8
/f/h+vz/0fn7/7v3+/+j8/j/i+ju/3jV2v9mtbn/VY+Q/0hpZ/8+TEb/ODo0/zQxK/81MCr/OzYx/0hE
Qf9iXlz/h4OC/6yqq//FyM//xtPm/63I8f+DsPT/VJPy/yx67/8Ua+3/CWPq/wRf5/8CXeT/AVvj/wBa
4/8AWeX/AFrn/wBa6f8AW+v/AFzs/wBd7v8AXu//AF/w/wBg8P8AYPH/AGDx/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg8f8AYPD/AF/w/wBe7/8AXe7/AFzs/wBb6/8AWun/AFrn/wBa
5v8AWuT/AFvi/wFb4v8CXOP/A1zi/wRa3P8FVc7/BEy4/wNBnP8ENoD/Bi5n/wspU/8UJ0T/HSY3/yYn
Lv8tKSj/MCok/zIrI/8zLyf/Njgy/z1LRv9Jamf/WJCQ/2i2uf921dr/g+ju/5Dx9v+b9fj/ovX3/6X1
9v+i9Pb/mfL1/43u8/+A6vH/dObw/2bh7v9Y3Oz/S9fq/0DT6f860ej/ONDo/znQ6P850Oj/Ns/n/y3M
5v8iyOP/FcPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP+m0tr/qNTb/67X3v+32+H/xOHm/9Ho7P/d7vH/5PL0/+b09v/l9fj/4/X5/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6/r8/+77/f/w/P3/8Pz9/+78/f/q+/z/5Pr8/9z5
+//S+Pr/xfn8/7b6/v+m+f7/lfP4/4Xk6f90ycz/Yqep/1OGhf9Ja2n/RlxX/0dUTf9OUkr/WVdO/2hj
Wf+BeW//oZmP/8C6s//V09H/1tzl/8HT7/+ev/L/dabw/1GP7P84fuf/JW/f/xdi1v8MWM7/BFHK/wBN
y/8ATND/AE3X/wBP3v8AUuT/AFXo/wBY7P8AXO//AF/y/wBh9P8AYvT/AGL0/wBh9P8AYfT/AGH0/wBh
9P8AYfT/AGH0/wBh9P8AYfT/AGL0/wBi9P8AYfT/AF/y/wBc7/8AWOz/AFXo/wBS5P8AUN//AFDa/wBQ
1P8AUM7/AVHJ/wNRxv8GUsT/CVLA/wtQuP8NTKv/DUSX/w06f/8NMGb/DylR/xMkQP8ZITH/ISEm/ygj
H/8uJx7/My4i/zc4Lf86RDz/QFVQ/0lqZ/9XiIf/Z6mr/3bKzv+E5On/jvL4/5b4/f+b+Pz/nfX4/53z
9v+a8vX/k/D0/4rt8v+A6vH/dOfw/2bh7v9X3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6P850Oj/Ns/o/y7M
5v8iyOT/FcPg/wq82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP9yucX/d7vI/4HAzP+TydP/qtXc/8Th5v/a7e//5vP1/+r2+P/o9/n/5fb5/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/7Pr9//D8/f/z/f3/8v39/+z8/f/h+vv/1Pf6/8b1
+P+69Pj/svX5/6v4/P+l+f7/nfb7/5Ls8P+C2Nz/cb/C/2GmqP9YkpP/WIaF/2CAff9tf3n/fYJ6/46K
gf+impH/ubGn/8/IwP/d2tb/3uDl/9Db7P+4zu//m7zt/36o6f9kleD/SX/S/y9owf8YU7L/CESr/wA9
rP8APLb/AD7C/wBC0P8ARtr/AEzi/wBS6f8AWe//AF70/wBi9/8AY/j/AGP4/wBi+P8AYvf/AGL3/wBi
9/8AYvf/AGL3/wBi9/8AYvj/AGP4/wBj+P8AYvf/AF70/wBZ7/8AUun/AEzi/wBG2v8ARNH/AEPI/wBD
vf8ARLP/AkSq/wVEo/8LRZz/EEWV/xVEjP8YQID/GTpw/xkzXv8ZLE3/GiY9/x0iMP8gHiT/JB0b/ykf
F/8uJhv/NTUp/zxJQP9DYFv/TXh2/1iQkP9nqav/d8PG/4ba3v+R7PD/mPb6/5r5/f+Z9/v/lvP3/5Pw
9P+P7/P/i+7y/4bs8v9+6vH/defw/2fi7v9Y3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6f850en/N9Do/y/N
5v8jyeT/FsPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP85nK//QKCy/0+nuP9ptML/i8XP/7HY3//S6ez/5PL0/+r3+P/p9/r/5ff6/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/7Pr9//H8/f/z/f3/8Pz9/+b7/P/V+Pr/wfT4/67x
9v+h8PX/nfH2/570+P+h9vr/ovb5/53x8/+Q5ef/f9XZ/3HGyf9pubz/bbK0/3qurv+Mrav/oa6r/7Kz
rv/Bu7b/z8jC/9rV0P/h39z/4uLk/9zh6f/Q2+z/wNHr/6vC5f+Qrdn/bZDF/0dwrf8lUpn/CzyO/wAx
kP8ALpz/ADCt/wA1v/8AO83/AELY/wBM4v8AVev/AF3x/wBh9v8AY/f/AGP3/wBi9/8AYvb/AGL2/wBi
9v8AYvb/AGL2/wBi9v8AYvf/AGP3/wBj9/8AYfb/AF3x/wBV6/8AS+L/AELY/wA7zf8AN8H/ADaz/wA2
pf8AN5b/AjeJ/wg4fv8POHP/Fzhp/x43YP8iNVb/JDJL/yQuQf8kKjf/JCYv/yUjJ/8mHx7/KB0Y/ysg
GP8wKiH/OEA4/0JdWP9Ofn3/W52f/2i2uf92ys7/htre/5Pn6v+c8fP/n/b5/5z2+v+W8/j/jvD1/4jt
8/+F7PL/g+vx/4Dr8f986fH/dOfw/2ji7v9Z3Oz/Stfq/z7S6f840Oj/N9Do/zjQ6f850en/N8/o/y/N
5v8jyOT/FcPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8LhZz/FIqg/yaTp/9EorP/bbbD/5rN1f/C4eb/2u3w/+Pz9f/l9fj/4/X5/+H1+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6vr8/+37/f/t+/3/5/r8/9r4+//F9fj/rvH2/5nt
9P+M7PL/i+3z/5Lw9P+c8/b/o/T2/6Pz9f+a7vD/jOfq/4Hf5P972d7/gtXa/5PT1/+p0tT/v9PT/9DU
0//a19X/4NvZ/+Pf3v/k4+L/4+Tl/+Tl6P/i5er/3OHp/87W4/+0wdX/jKG9/157ov8zV4r/Ej18/wIu
ff8AKYn/ACma/wAtrf8BMrv/ATrI/wFF1P8BUN7/AVnm/wFe6/8BYO3/AWDt/wFf7P8BX+v/AV/r/wFf
6/8BX+v/AV/r/wFf6/8BX+z/AWDt/wFg7f8BXuv/AVnm/wFQ3v8BRdT/ATrI/wEyu/8BLa3/ACyd/wAs
jP8BLXz/BC1s/wsuX/8ULlH/HS5G/yYtPP8qLTT/LCwv/ywsLf8rKyv/Kyoq/yspJ/8sJyL/LSUf/zAq
I/82NzD/QFFL/010cv9bmpz/ab3B/3bV2v+E5On/kezw/5zx8/+j8/X/o/T2/5zz9v+S8PT/iO3z/4Dq
8f986fH/e+nw/3rp8P946PD/ceXv/2bh7v9Y3Oz/Stfq/z/S6f840Oj/N9Do/zfQ6P830Oj/NM7n/yzM
5f8hyOP/FMPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8Ae5T/AH+X/w+Hnv8slqr/VKm5/3+/y/+o09v/weHm/9Dp7v/Y7/P/3fL2/+D1+f/j9/v/5fj7/+X4
/P/m+Pz/5vn8/+f5/P/o+fz/6Pn8/+j5/P/m+fz/5Pn8/+H4+//c9/v/0/b6/8Xz+P+y8Pb/nO30/4rr
8v+A6vH/gevx/4ru8/+W8fT/oPT2/6T09v+f8/b/mPH1/5Hu9P+Q7PL/mevw/6rq7v+/6ez/1Onq/+Lp
6P/p6Of/6ujn/+nn5v/m5+b/5ufm/+np5//s6+n/6+ro/+Li4v/Lz9T/prC+/3qMpP9PaYz/Lk59/xs8
e/8RMoH/DC2M/wormf8ILaT/BjOv/wY+uv8GScT/B1LM/wdX0f8HWdP/B1nT/wdY0v8HWNL/B1jS/wdY
0v8HWNL/B1jS/wdY0v8HWNL/B1nT/wdZ0/8HV9H/B1LM/wdJxf8HP7v/BzSw/wcso/8HKJX/BiaF/wYm
df8HJ2X/CihW/xAnSP8ZJzr/Iicv/yonJv8uKCL/Lioi/ywtJv8qMCv/KTQw/yw2Mv8wNzL/NTk0/z1A
Ov9FT0n/UGpm/12NjP9rsrT/eNLX/4Po7v+O8vj/mPb6/5/2+f+j9Pb/ofT2/5nx9f+O7vP/g+vy/3vp
8P925/D/dOfw/3Pm7/9w5e//auPu/2Df7f9U2+z/SNbq/z7S6f840Oj/Nc/n/zTO5/8yzeb/Lszl/yfJ
5P8cxuL/EsHf/wi82/8CtNP/AKnI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeJH/AHuU/wuCmv8hjqP/P52v/2Cuvf+BwMv/m87X/7Ha4f/E5Or/1O3y/+D0+P/n+Pv/6fn8/+j5
/P/m+Pz/5vj7/+f5/P/q+vz/7Pr9/+v6/f/m+fz/3ff7/9D0+f/C8fj/tO72/6bs9f+Y6vP/iuny/4Dp
8f976fD/ferx/4Xs8v+P7/P/mPH1/5/z9v+h9Pj/ovX5/6T2+/+p9vv/s/b7/8L2+v/T9vj/4vX2/+30
9P/w8vH/7u/v/+rt7P/n6ur/5eno/+nq6P/t7ej/7+zn/+rn4v/Z2Nf/vcDG/5uksv95iJ7/XG+Q/0Zb
h/80SYP/JjqB/xswgv8TLIX/Dy6L/w42lP8PQJ3/EEik/xBMqP8QTqr/EE6q/xBNqf8QTan/EE2p/xBN
qf8QTan/EE2p/xBNqf8QTan/EE6q/xBOqv8QTKj/EEik/xBBnv8QOJb/EDCN/xEpg/8QJXf/ECRq/xAk
XP8RJE7/FCRC/xgjNv8fISr/JiEg/ysiGv8sJRr/KSog/yQxKv8gOTb/IEFB/ydKSv8yUVD/QFpX/09l
Yf9ddXH/aY2K/3Sqqf9/yMr/iOHl/5Dx9v+W+P3/mvn9/5z2+v+c8/b/mfH1/5Lv9P+K7fL/gevx/3no
8P9z5u//b+Xv/2rj7v9l4e7/X9/t/1fc7P9O2Ov/RdXq/z3S6f830Oj/Ms7n/y7M5f8qyuT/JMji/x7F
4f8Vw+D/DcDe/wa72v8BtNP/AKrI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AepP/AHyV/weAmP8Uh57/JpGm/zydr/9Vqrr/b7jF/43H0v+s2OD/yOft/97y9v/p+fz/7Pr9/+n6
/f/m+Pv/5fj7/+j5/P/s+vz/7/v9/+37/f/k+fz/0vT6/7rv9/+j6fT/j+Xy/4Pk8f985PD/eeXw/3jn
8P956PD/e+rx/4Dr8f+G7fL/ju7z/5bw9f+g8/f/q/b6/7f4/P/C+v7/zfv+/9j7/v/j+/z/7Pr7//H5
+f/x9vb/7vPz/+rw8P/m7e3/5Ovr/+br6v/q7On/7Ovn/+rn4//g3tv/0NDR/7u+xf+kq7j/jZaq/3V/
m/9bZon/Q015/y44a/8fLGT/GSpk/xcuaf8ZNnD/Gz12/xtAef8bQXr/G0F6/xtAef8bQHn/G0B5/xtA
ef8bQHn/G0B5/xtAef8bQHn/G0F6/xtBev8bQHn/Gz12/xs4cv8bMm3/Gy1n/xwoYP8cJlj/HCRP/xwk
Rf8dIzv/HiMy/yEhKf8lHyD/KR4Z/ysgFv8pJRr/Iy0m/xs4Nv8VRUn/FVNa/yBhaP80cHX/TYCC/2WQ
j/94oZ7/hLSx/47Ix/+U29z/mOvu/5v1+P+b+Pz/mff7/5bz+P+S8PT/ju7z/4rt8v+E7PL/f+rx/3jo
8P9x5u//aePu/2Hf7f9Z3Oz/Utrr/0zY6/9H1ur/QtTq/zzS6f82z+f/L8zl/yfJ4/8gxuH/GcPf/xPB
3v8Nv97/CL3d/wS62f8BtNP/AKrI/wCduv8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AfZb/AH6X/wSBmP8Jg5v/D4ed/xqNov8slqn/RaO0/2i2xP+Sy9b/ueDn/9bv9P/m+Pv/6vr9/+j5
/f/k+Pv/4/f7/+b4+//r+fz/7fr8/+n6/P/c9/v/wvH4/6Pp9P+E4vH/bN3u/2Lc7f9j3e3/aeHu/3Hl
7/936PD/eunw/3vq8f9+6vH/g+vy/43t8/+d8PX/sfT4/8T4+//V+v3/4fz9/+n9/f/u/P3/8fz8//L6
+v/x+Pj/7fb2/+ny8//l8PH/4+3u/+Ts7P/m6+r/6Onn/+fm5P/j4eD/3Nzd/9TV2P/HytD/tbrD/5yh
rf98gJD/W15x/z5AVv8rLUX/IidA/yAoQf8jLUb/JTJL/yY0TP8mNE3/JjRN/yY0Tf8mNEz/JjRM/yY0
TP8mNEz/JjRM/yY0TP8mNE3/JjRN/yY0Tf8mNEz/JjNL/yYwSf8mLUf/JitE/yYoQP8mJzz/JiY4/yYm
M/8mJi7/JyYq/ykkJP8rIh//LSIb/y0kHP8qKyT/ITY0/xZFSf8OVmD/D2d1/x56iP85j5r/WaSr/3i4
u/+Pycn/nNfW/6Pi4f+l6+v/pPHy/6L19/+d9fj/lvP3/47w9f+I7fP/g+vy/4Hr8f9/6vH/fOnw/3fn
8P9u5O//Y+Dt/1jc7P9O2Ov/RtXq/0LU6f8/0+n/PdLp/znR6P8zzuf/Ksrk/yDG4f8Wwt7/Dr7c/wm8
2/8GvNv/A7vb/wK52f8AtNP/AKrI/wCduv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wGAmP8AgJj/AH+X/wOBmf8Nh53/JJOo/0qnuf93wM3/o9jh/8Xq8f/Z9Pn/4fj8/+P4
/P/h9/v/4Pb6/+L3+v/k9/v/4vf7/9v2+v/L8vj/ruv1/4vj8f9p2+7/Utbr/0rW6v9P2ev/W93s/2ni
7v9y5u//dufw/3bo8P936PD/e+nw/4br8v+Z7vT/sfL2/8n2+f/d+vv/6fz8//D9/f/y/f3/8/39//L8
/P/w+vr/7fj4/+n19v/l8vT/4/Dx/+Pt7v/l7Oz/5unp/+bn5v/k5eT/4uTl/97i5P/W3N//x87R/66z
t/+Mj5L/aGdq/0hFRv8zLi//KSUl/ycjJP8qJyj/LSor/y0rLP8tKyz/LSss/y0rLP8tKyz/LSss/y0r
LP8tKyz/LSss/y0rLP8tKyz/LSss/y0rLP8tKyz/LSss/y0qK/8tKSr/LSkq/y0oKf8tKSn/LCkp/ysq
Kf8rLCr/LC0q/y4tKf8xLSf/NC4n/zUyLP8yOzb/KEhJ/xxYX/8Tanj/FH2P/ySSo/9Bqbj/ZcHK/4bW
2/+e5uf/qu/v/6708/+u9fX/qvX2/6X19v+d8/b/k/D0/4jt8/+A6vH/e+nw/3no8P946PD/d+fw/3Lm
7/9p4u7/Xd7t/1DZ6/9F1er/PdLp/znR6P840Oj/N9Do/zXP5/8uzOX/Jcji/xnD3/8Pvtz/Brva/wK5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyU/wB7lP8Cf5j/FYuh/zWesv9dtsf/hc7c/6fh7P+97PX/zfL5/9f1
+v/d9fr/3vX6/9z1+f/W8/n/zPH3/77t9f+r6fP/kOPx/3Lc7v9W1uv/Q9Pp/z7T6f9E1er/Udrr/1/f
7f9p4u7/buTv/2/l7/9x5u//dufw/4Lq8f+U7fP/q/H2/8L1+P/V+Pr/4vv8/+r8/f/v/f7/8v7+//P9
/v/y/P3/7/r7/+v3+f/o9fb/5vP0/+fx8v/p7/D/6u3t/+nr6v/k6Oj/3ubn/9Tj5f/H297/tszO/56x
sv+AjYv/YWVg/0ZDOv80LCL/LCEW/yofFP8tIhf/LyQa/y8lGv8vJRr/LyUa/y8lGv8vJRr/LyUa/y8l
Gv8vJRr/LyUa/y8lGv8vJRr/LyUa/y8lGv8vJRr/LyUa/zAlGv8wJRr/MCUa/y8mHP8tKSD/Kywl/ygw
K/8nNTH/KDk2/y4+Ov83Qj7/P0hC/0VPSf9FWVb/PmZn/zN1fP8rhZL/K5an/zipuv9Rvsz/b9Pd/4zm
6/+g8/b/qvn7/637+/+r+fr/p/b3/6L09v+a8vX/j+/z/4Xs8v986fH/dufw/3Pm7/9x5u//buTv/2ni
7v9h3+3/Vtvs/0rX6v9A0+n/ONDo/zTO5/8yzuf/MM3m/y3L5f8nyeP/HsXg/xPA3f8KvNv/A7nZ/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8BfZb/D4ef/yaYr/9CrsL/YMPW/33V5f+W4u//sOv1/8fx
+P/X9Pn/3fX5/9Xz+P/D7vb/rOjy/5Xi7/+A3e3/a9nr/1fV6v9H0un/PNHo/znR6P8/1On/SNfq/1Tb
7P9d3u3/Y+Dt/2ji7v9t5e//dOfw/3/p8f+O7PL/n+/0/7Hy9v/B9fj/z/j6/9v6+//m/P3/7v3+//P+
/v/1/f7/8/z8/+/6+//s+Pn/6vb3/+z19v/w9fX/8fPz/+3w7//i6ur/0ePm/7va3/+jzdP/jLvB/3eg
pP9hfn7/TVtV/z08Mv8xJxr/LB0P/ysbDf8sHQ//LiAS/y4gEv8uIBL/LiAS/y4gEv8uIBL/LiAS/y4g
Ev8uIBL/LiAS/y4gEv8uIBL/LiAS/y4gEv8uIBL/LiAS/y4gEf8vHxH/LiAS/y0jFv8qKB3/JC8o/x43
NP8cQUH/H0tN/ypVV/87YGD/TWxq/1x4dP9ig4H/X4+P/1eaoP9QprD/TrK//1bAzf9m0Nv/et/o/4zs
8v+Z9fn/n/n8/6H5/P+g9/n/nfT3/5ny9f+T8PT/i+7y/4Pr8f976fD/dOfw/27l7/9p4+7/Y+Dt/13e
7f9W2+z/Tdjr/0XV6v890un/Ns/o/zHN5v8sy+X/KMnk/yPH4v8cxOD/FcHe/w693P8Hutr/ArjY/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyV/wB8lP8Bfpf/CYaf/xWVrf8lpr7/OLnQ/0/J3/9s1un/kOLw/7Tr
9f/O8fj/2PP5/8rw9/+t6PL/id7t/2jV6P9S0Ob/Rc7l/z3O5v86z+f/ONDo/znR6P880un/QtTq/0nX
6v9Q2ev/WNzs/2Df7f9p4+7/c+bv/33p8P+G6/L/kO3z/5vv9P+n8fX/tfP3/8b2+f/X+fv/5vz9//H9
/v/1/f7/9f39//L7/P/w+vv/7/n6//L6+v/2+vr/9/n5//D19f/e6+3/wN7j/5vN1v93usX/W6Sw/0mL
lP89bXH/NlBO/zI2L/8uJRr/LB0Q/ysbDv8sHRD/LR8T/y0fE/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0f
E/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0fEv8uHhH/Lh8S/ywjF/8mKiL/HTUy/xVC
RP8RUFf/Fl9p/ydweP9Bgof/XJOV/3Sko/+AsK//grq6/37BxP94x83/dM7W/3bW3v983ub/g+bt/4ns
8/+O8fb/kPP4/5Hz9/+R8fb/kPD0/43u8/+K7fL/huzy/4Dr8f966fD/c+bv/2rj7v9h3+3/WNzs/1DZ
6/9K1+r/RdXq/0HT6f880en/Ns/n/y7M5v8nyeP/H8Xh/xfC3/8Rv93/DL3b/wi72v8Eudn/AbjY/wC4
2P8Audn/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB9lf8AgJj/BIef/weSrP8Mobv/FrDL/ye+2f9Fy+P/cNnr/53l
8v/A7fb/zPD3/7vr9P+U4e7/Z9Tn/z/K4v8qxd//JMTg/yfH4v8vy+X/Nc/n/zjQ6P860en/PNLp/z/T
6f9F1er/Tdjr/1nc7P9l4e7/cOXv/3jo8P996fH/gerx/4Xr8f+N7PL/m+70/7Dy9v/G9fn/2/n7/+v8
/f/y/f3/9f39//T9/f/y/Pz/8vz8//b9/f/5//7/+f79/+/4+f/X7O//r9rh/4DDz/9Tq7v/M5Ok/yR7
iv8iY2z/JkxO/y04NP8wKyP/MCUb/zAjGf8wJRv/MCce/zAnHv8wJx7/MCce/zAnHv8wJx7/MCce/zAn
Hv8wJx7/MCce/zAnHv8wJx7/MCce/zAnHv8wJx7/MCce/zEmHP8xJRv/MSUc/y8qIv8oMy//HUBC/xJQ
Wf8NYnD/E3WF/yiKmf9Ioaz/are9/4jKzP+Z19f/n9/e/57i4/+Z5Ob/leXo/5Hn6/+N6O7/ierw/4Xr
8f+D6/L/gezz/4Hs8v+B6/L/gevy/4Dq8f+A6vH/furx/3zp8f946PD/cOXv/2Xh7v9Z3Oz/Ttjr/0XV
6v9A0+n/PdLp/zzR6f850Oj/NM7n/yvL5P8hxuH/FsLe/w6+3P8Iu9r/BLrZ/wK52f8BuNj/AbjY/wC4
2f8Audr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCQq/8Anbn/AKrI/w231f8pxN//VtLn/4Xe
7v+q5/L/t+r0/6Tl8f972ur/S8zj/yPC3f8Pvdv/Db7c/xbC3/8kyOL/L8zl/zTO5/82z+f/Ns/o/zjQ
6P890un/RtXq/1La6/9f3+3/auPu/3Hl7/9z5u//cubv/3Pm7/945/D/hunx/5zt9P+18vf/zfb5/9/5
+//q+/z/7/z9//L9/f/y/f3/8/39//X////3////8////+f6+//N7fD/o9nh/3LBzv9FqLn/JpGk/xt8
jP8eaXP/KFda/zRIRf86PTf/PDkx/z04L/88OTH/PDoz/zw7M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7
M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7M/88OzP/PDoz/zw5Mf89ODD/PTkx/zo9N/8zR0T/KFVY/x1l
cP8XeIj/HYye/zKhsv9Sucb/ddDY/5Pj5v+l7/D/rPX1/6329v+q9fX/pfP0/5/y9P+W7/P/jO3y/4Pr
8f986fD/eOjw/3bn8P915/D/dOfw/3Tm8P905/D/defw/3Tn8P9x5e//auPu/1/f7f9S2uv/RtXq/z3S
6f840Oj/Ns/o/zbP5/80zuf/L8zl/ybI4/8bw+D/EL/d/we72v8Cudj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCPq/8Am7j/AKjH/wa00/8dv9z/Qsvk/2nW
6f+I3u3/k+Du/4Pc7P9h0ub/Ocbg/xe92/8Hudn/B7ra/w++3f8bxOD/Jsjj/yvL5P8uzOb/Mc3m/zTO
5/850ej/QtTp/0zY6/9X3Oz/YN/t/2bh7v9m4u7/Y+Ht/2Lh7f9n4u7/c+Tv/4jo8v+h7fT/ufL3/8z2
+f/a+fv/5fv8/+39/f/y/v7/8/7+//L////t////5P3+/9X4+v+97fH/mtzk/3LI1P9Ps8L/NqCw/y+Q
nv80gYr/P3R3/0ppZ/9RYVz/VF5X/1RdVv9UXlf/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1Nf
Wf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NeV/9UXVb/VF1X/1FhXP9Mamj/QnZ5/ziE
jf8zlKL/OKW1/0i3x/9hy9f/fd7m/5Tu8v+j+Pr/qvz9/6z8/f+q+vv/pvf5/6D19/+X8vX/jO/0/4Hr
8v956PD/c+bv/27l7/9r4+7/aOLu/2bh7v9m4u7/Z+Lu/2ji7v9m4e7/YN/t/1fc7P9M2Ov/QtTp/znR
6P80zuf/Mc3m/y7M5v8ry+T/Jsjj/x7F4P8Vwd7/DL3b/wS52f8AuNj/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8Am7n/AKfH/wSz0v8UvNr/LsXg/0rN
5f9f0uf/Z9Tn/1zR5v9EyuL/KMHd/xC72f8FuNj/BLnZ/wq82/8TwN3/G8Pg/yHG4f8nyeP/LMvl/zLO
5/840Oj/P9Pp/0fW6v9O2Ov/VNvs/1jc7P9X3Oz/VNzs/1Tb7P9X3Oz/Y9/t/3Xj7/+K6fL/oe70/7Xy
9//H9vn/2Pn7/+b8/P/w/f7/8v7+/+z+/v/g/P7/0Pn8/770+P+r7PH/k+Ho/3vT3f9mxtH/WLnF/1Sv
uP9ZpKv/YZue/2qUk/9vj4v/cY2I/3GMh/9xjYj/cI2J/3COif9wjon/cI6J/3COif9wjon/cI6J/3CO
if9wjon/cI6J/3COif9wjon/cI6J/3COif9wjon/cI2J/3GNiP9xjIf/cYyI/2+Pi/9rlZT/ZJ6g/16p
r/9atL7/W8DL/2TM2P9z2eP/gubt/5Dw9f+Z9vr/nfn8/5/5/P+e9/r/nPX4/5jz9/+R8fX/ie7z/4Dr
8v946PD/cOXv/2ni7v9h4O3/XN7s/1jc7P9X3Oz/WNzs/1nc7P9Y3Oz/VNvs/07Y6/9H1ur/P9Pp/zjQ
6P8yzuf/LMvl/yfJ4/8hxuH/G8Pg/xTB3v8Ovtz/CLva/wO52P8At9j/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wKz0/8Lutr/GsDe/ynF
4P82x+H/Osjh/zTG4P8mwt3/Fr3b/wm52f8DuNj/ArjY/wW62f8KvNv/EL/c/xbC3v8fxeH/KMnk/zDN
5v830Oj/PdLp/0LU6v9F1er/SNbq/0rX6v9J1+r/R9bq/0fW6v9K1+r/VNrr/2Pe7f915O//ieny/5zu
9P+x8vb/x/b5/9z6+//p/P3/7Pz9/+L7/P/P+Pv/ufT4/6bw9f+Y6/H/jubt/4bg5/+A2uH/fdTb/33P
1P+Ayc3/hcTF/4nAv/+Mvbv/jby5/427uf+NvLn/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428
uv+NvLr/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428uf+Nu7j/jby5/4y9u/+KwcD/h8bH/4PM
z/+A0tf/f9jf/4De5f+D5Ov/hunw/4nt8/+L8Pb/jPH3/43x9v+O8fb/jfD1/4vv9P+H7vP/g+zy/37q
8f936PD/buTv/2Th7f9Z3ez/UNnr/0vX6v9J1ur/Sdbq/0rX6v9K1+r/SNbq/0XV6v9C1Or/PdLp/zfQ
6P8wzeb/KMnk/x/F4f8Wwt7/EL/d/wu92/8Hu9r/BLnZ/wK42P8AuNj/ALfY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbr/AKrI/wG00/8Eudn/Cr3c/w++
3P8Uvtz/Fb7b/xO92/8OvNr/CLrZ/wO52P8BuNj/ALjY/wG42P8Dudn/B7va/w6+3P8Xwt//I8fi/y3L
5f81z+f/OdHo/zzS6f890un/PtLp/z/S6f8+0un/PdLp/z3S6f9A0+n/SNbq/1Ta6/9i3+3/c+Tv/4Xp
8f+b7vT/tfL3/8z2+f/d+fv/4Pn7/9T3+v+99Pj/pfD1/5Hs8/+J6/H/ierw/47q7/+V6+7/murt/53p
6/+f5+j/oOXl/6Dj4/+h4uH/oeHg/6Hh4P+h4eD/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh
4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4P+h4eD/oeHg/6Hi4f+h4+P/oOXl/5/n
6P+d6ev/muvt/5Xr7/+P6/D/iOvx/4Lq8f9/6vH/ferx/33q8f996vH/ferx/33p8f986fH/e+nx/3no
8P905u//a+Pu/1/e7f9S2uv/R9bq/0DT6f890un/PdLp/z7S6f8/0un/PtLp/z3S6f880un/OdHo/zXP
5/8ty+X/I8fi/xfC3/8Ovtz/B7va/wO52f8Budj/AbjY/wG42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wG6
2v8Budn/AbjY/wG42P8BuNj/ALjY/wC42P8AuNj/ALjY/wC32P8AuNj/ArnY/wi72v8Rv93/HMTg/yfJ
4/8uzOX/M87n/zbP5/830Oj/ONDo/zjQ6P840Oj/N9Do/zfQ6P860ej/QNPp/0nX6v9V2+z/YuDt/3Ll
7/+H6fL/n+30/7bx9//H9Pj/y/T5/8Dz+P+r7/X/lOzz/4Tq8f+A6vH/hezy/5Dv8/+c8vX/pfT2/6j1
9v+q9vb/qfX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j1
9v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qfX2/6r2
9v+o9fb/pfT2/53y9f+T8PT/iO3y/3/q8f946PD/defw/3Lm7/9x5e//cOXv/3Dl7/9x5e//ceXv/3Dl
7/9s5O//ZODu/1jc7P9L1+r/QdPp/zrR6P830Oj/N9Do/zjQ6P840Oj/ONDo/zfQ6P82z+f/M87n/y7M
5f8nyeP/HMTg/xG/3f8Iu9r/ArnY/wC42P8At9j/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC4
2f8At9j/ALbX/wC21/8At9f/ALfY/wC42P8AuNj/ALjY/wC31/8At9f/AbjY/wa62f8Nvdv/FcHe/x7F
4P8lyOL/Ksrk/y7M5f8yzuf/Nc/n/zfQ6P830Oj/Ns/o/zbP6P840Oj/PdLp/0PV6v9M2ev/Vtzs/2Lg
7f9y4+//hubx/5jp8/+m6/X/q+31/6Ts9P+W6/P/h+nx/33p8f986vH/g+3y/47w9P+Z9Pf/ovb4/6X4
+v+m+fv/pfr8/6T6/P+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6
/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+k+vz/pfr8/6b5
+/+l+Pr/ovb4/5v09/+S8fX/h+3z/37q8f925/D/cOXv/2rj7v9m4e7/Y+Dt/2Lg7f9j4O3/ZOHu/2Th
7v9h4O3/W93t/1HZ6/9H1ur/PtLp/zjQ6P82z+j/Ns/o/zfQ6P830Oj/Nc/n/zLO5/8uzOX/Ksrk/yXI
4v8exeD/FcHe/w292/8Gutn/AbjY/wC31/8At9f/ALfY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC4
2f8At9j/ALbX/wC21/8At9f/ALfY/wC42P8AuNj/ALjY/wC32P8At9f/AbjY/wS52f8Iu9r/Db3c/xPA
3f8Zw9//IMbh/yfJ4/8uzOX/NM7n/zfQ6P840On/ONDp/zjQ6P850Oj/PNLp/0DU6f9F1ur/TNjr/1Tb
7P9e3e3/at/u/3fg7/+A4vD/huTx/4Xl8f+B5vH/fOfw/3no8P976vH/gezy/4nv9P+R8fX/lvP3/5n0
+P+Z9fn/mfb5/5j2+v+X9vv/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3
+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f2+/+Y9vr/mfb5/5n1
+f+Z9Pj/l/P3/5Lx9f+M7/T/hO3y/33q8f915/D/bOTu/2Th7f9c3uz/Vtvs/1Pa6/9T2uz/Vdvs/1bb
7P9U2+z/UNnr/0nX6/9D1Or/PNLp/znQ6P840Oj/ONDp/zjQ6f830Oj/NM7n/y7M5f8nyeP/IMbh/xnD
3/8TwN3/Db3c/wi72v8Eudn/AbjY/wC31/8At9f/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2v8AuNj/ALfY/wC32P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK42P8Dudn/Brra/wm8
2/8Pvtz/FsLe/yDG4f8qyuT/Ms3m/zfQ6P850en/OdHp/znQ6P850Oj/OtHo/zzS6f8/0+n/Q9Tq/0fW
6v9M1uv/Udfr/1fY7P9d2ez/Ytvt/2je7v9t4e7/ceTv/3bn8P966fD/furx/4Ls8v+F7fP/h+3z/4ju
9P+J7vT/iO/0/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv
9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/0/4nu
9P+I7vT/h+3z/4Xt8/+D7PL/f+vx/3rp8P9z5u//aePu/17e7f9T2uv/Stfq/0bV6v9F1er/RtXq/0fW
6v9H1ur/RNXq/0HT6f8+0un/O9Hp/znQ6P850Oj/OdHp/znR6f830Oj/Ms3m/yrK5P8gxuH/FsLe/w++
3P8JvNv/Brra/wO52f8CuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK5
2f8Gu9r/Dr7c/xnD3/8kyOL/Lszl/zTO5/83z+j/N9Do/zbP6P82z+f/Ns/n/zfP5/830Oj/OdDo/zrR
6P870ej/PdHo/z/R6f9C0un/SNXq/1HY6/9c3ez/Z+Hu/3Dl7/915/D/eOjw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eOjw/3Xn8P9v5e//ZeHu/1jc7P9L1+r/QdPp/zzR6P850Oj/OdDo/zrQ
6P860Oj/OdDo/zjQ6P83z+f/Ns/n/zbP5/82z+j/N9Do/zfP6P80zuf/Lszl/yTI4v8Zw9//Dr7c/wa7
2v8Cudn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALvb/wC6
2v8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC42f8AuNj/ALjY/wC4
2P8Dudn/Crzb/xPB3v8exeH/J8nk/yzM5f8vzeb/L83m/y7M5v8tzOb/Lczm/y3M5f8tzOX/Lczl/y3M
5v8uzOb/L83n/zHO5/81z+j/O9Lp/0XW6v9R2uz/Xd/t/2fi7/9s5O//buXv/27l7/9t5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/23k7/9u5e//buXv/2zk7/9n4u//Xd/t/1La7P9G1ur/PNLp/zbQ6P8yzuf/MM3n/y7M
5v8tzOb/Lczl/yzM5f8tzOX/Lczm/y3M5v8uzOb/L83m/y/N5v8szOX/J8nk/x7F4f8Twd7/Crzb/wO5
2f8AuNj/ALjY/wC42P8AuNn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC5
2f8Autr/ALvb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrv/AKvJ/wC11P8Autr/ALzc/wC7
3P8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC52v8Audn/ALnZ/wC5
2f8Cutr/B7zb/w6/3v8Ww+D/Hcbi/yHI4/8jyOT/I8nk/yLI5P8iyOP/Icjj/yDI4/8gx+P/H8fj/yDI
5P8jyeT/Jsvm/yrN5/8wz+n/NtLq/z/V6/9K2ez/U9zu/1vf7/9g4e//YeHv/2Dh7/9f4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/1/g7/9g4e//YeHv/2Dh7/9c3+//Vd3u/0zZ7f9D1uz/OtPq/zPQ6f8tzef/KMvm/yTJ
5P8hyOT/H8fj/x/H4/8gx+P/Icjj/yLI4/8iyOT/I8nk/yPI5P8hyOP/Hcbi/xbD4P8Ov97/B7zb/wK6
2v8Audn/ALnZ/wC52f8Audr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC6
2v8Au9z/ALzc/wC62v8AtdT/AKvJ/wCeu/8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCSrP8An7v/AKvK/wC11f8Autv/ALzd/wC8
3P8Au9v/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALna/wC5
2v8Butr/BLvb/wm93f8OwN7/EsHf/xTD4P8Vw+D/FsPg/xXD4P8Vw+D/FMPg/xPC4P8TwuD/E8Lg/xXD
4f8axeL/IMjk/yjM5v8wz+n/N9Lq/z7V6/9E1+z/Stnt/0/b7f9R3O7/Utzu/1Lc7v9R3O7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Hc7v9S3O7/Utzu/1Hc7v9P2+3/S9nt/0bX7f9A1ez/OdPr/zLQ6f8qzOf/Isnk/xrF
4v8Vw+H/E8Lg/xLC4P8TwuD/FMPg/xXD4P8Vw+D/FsPg/xXD4P8Uw+D/EsHf/w7A3v8Jvd3/BLvb/wG6
2v8Audr/ALna/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC7
2/8AvNz/ALzd/wC62/8AtdX/AKvK/wCfu/8Akqz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALrb/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC4
2P8BuNj/ArnZ/wS62f8Gu9r/CLzb/wm82/8Kvdv/Cr3b/wq82/8JvNv/Cbzb/wi82/8HvNv/CLzb/wu9
3P8SwN7/HMTh/ybJ5P8wzeb/N9Do/zvS6f8/0+r/QdTq/0LU6v9D1er/Q9Xq/0PV6v9D1er/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PV6v9D1er/Q9Xq/0PV6v9C1Or/QdTq/z/T6v880un/ONDo/zDN5v8nyeT/HMTh/xLA
3v8Lvdz/CLzb/we82/8IvNv/Cbzb/wm82/8KvNv/Cr3b/wq92/8JvNv/CLzb/wa72v8Eutn/ArnZ/wG4
2P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALrb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQqv8Am7f/AKfE/wCvzv8AtNP/ALXV/wC1
1P8AtNP/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz
0/8As9P/ALTT/wG00/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8As9P/AbTT/wS1
1P8Mudb/Fr3Z/yLC3P8sxt//Msnh/zXK4v82y+L/Nsri/zXK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v81yuL/Nsri/zbL4v81yuL/Msnh/yzG3/8iwtz/Fr3Z/wy5
1v8EtdT/AbTT/wCz0/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8BtNP/ALTT/wCz
0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wC0
0/8AtdT/ALXV/wC00/8Ar87/AKfE/wCbt/8AkKr/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH+W/wB/lv8AgJj/AIWe/wCNp/8AlrH/AJ+8/wCnxP8Aqsj/AKvK/wCr
yf8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKnI/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnH/wCpx/8Aqcf/AKnH/wKq
yP8Ircr/EbHN/xu10P8judL/KbvU/yu81P8rvNT/KrzU/ym71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8pu9T/KrzU/yu81P8rvNT/KbvU/yO50v8btdD/EbHN/wit
yv8Cqsj/AKnH/wCpx/8Aqcf/AKnH/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aq8n/AKvK/wCqyP8Ap8T/AJ+8/wCWsf8Ajaf/AIWe/wCAmP8Af5b/AH+W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIOc/wCJov8AkKr/AJax/wCbt/8Anrr/AJ+7/wCe
u/8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrr/AJ26/wCduv8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCcuf8AnLn/AJ25/wKd
uv8GoLv/DKK9/xOlv/8ZqMH/HarC/x6qwv8eqsL/HarC/xyqwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8cqsL/HarC/x6qwv8eqsL/HarC/xmowf8Tpb//DKK9/wag
u/8Cnbr/AJ25/wCcuf8AnLn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbr/AJ26/wCe
uv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrv/AJ+7/wCeuv8Am7f/AJax/wCQqv8AiaL/AIOc/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIKa/wCFnv8AiaL/AI2n/wCQqv8Akaz/AJKs/wCR
rP8Akaz/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wGR
q/8Dkqz/B5St/wuVrv8Ol6//EJiw/xGYsP8RmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xGYsP8RmLD/EJiw/w6Xr/8Lla7/B5St/wOS
rP8Bkav/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
rP8Akaz/AJKs/wCRrP8AkKr/AI2n/wCJov8AhZ7/AIKa/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj7AICY/ACAmPwAgJj8AICY/QCAmP4AgJj/AIGZ/wCCmv8Ag5z/AIWe/wCGn/8Ah5//AIeg/wCH
oP8Ah6D/AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
n/8Ah5//AIef/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCH
oP8Bh6D/A4ig/wSIof8FiaH/Bomh/weJof8HiaH/B4mh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/B4mh/weJof8HiaH/Bomh/wWJof8EiKH/A4ig/wGH
oP8Ah6D/AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIef/wCH
n/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
oP8Ah6D/AIeg/wCHn/8Ahp//AIWe/wCDnP8Agpr/AIGZ/wCAmP8AgJj+AICY/QCAmPwAgJj8AICY/ACA
mPsAgJjcAICY3gCAmOEAgJjmAICY7QCAmPQAgJj7AICY/wCAmP8AgJj/AICY/wCAmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCAmf8AgJn/AICZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AICZ/wCAmf8AgJn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgJn/AICY/wCAmP8AgJj/AICY/wCAmPsAgJj0AICY7QCAmOYAgJjhAICY3gCA
mNwAgJimAICYqgCAmLEAgJi+AICY0ACAmOMAgJj0AICY/gB/l/8Af5f/AH+W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+W/wB/l/8Af5f/AICY/gCAmPQAgJjjAICY0ACAmL4AgJixAICYqgCA
mKYAgJhoAICYbwCAmHsAgJiSAICYrwCAmNAAgJjtAICY/QB/l/8Af5f/AH+X/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+X/wB/l/8Af5f/AICY/QCAmO0AgJjQAICYrwCAmJIAgJh7AICYbwCA
mGgAgJgwAICYOQCAmEoAgJhpAICYkgCAmL4AgJjmAICY/ACAmP8AgJj/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wCAmP8AgJj/AICY/ACAmOYAgJi+AICYkgCAmGkAgJhKAICYOQCA
mDAAgJgGAICYEQCAmCYAgJhKAICYewCAmLEAgJjhAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmOEAgJixAICYewCAmEoAgJgmAICYEQCA
mAYAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mADAAAAAAAAAAAAAAAAAAAAAAAAMAMAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAwAwAAAAAAAAAAAAAAAAAAAAAAA
DAA=
================================================
FILE: DS_Map/Editors/SafariZoneEditor.Designer.cs
================================================
namespace DSPRE.Editors
{
partial class SafariZoneEditor
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SafariZoneEditor));
this.buttonSaveAs = new System.Windows.Forms.Button();
this.buttonSave = new System.Windows.Forms.Button();
this.tabPageSuperRod = new System.Windows.Forms.TabPage();
this.safariZoneEncounterGroupEditorSuperRod = new DSPRE.Editors.SafariZoneEncounterGroupEditor();
this.tabPageGoodRod = new System.Windows.Forms.TabPage();
this.safariZoneEncounterGroupEditorGoodRod = new DSPRE.Editors.SafariZoneEncounterGroupEditor();
this.tabPageOldRod = new System.Windows.Forms.TabPage();
this.safariZoneEncounterGroupEditorOldRod = new DSPRE.Editors.SafariZoneEncounterGroupEditor();
this.tabPageSurf = new System.Windows.Forms.TabPage();
this.safariZoneEncounterGroupEditorSurf = new DSPRE.Editors.SafariZoneEncounterGroupEditor();
this.tabPageGrass = new System.Windows.Forms.TabPage();
this.safariZoneEncounterGroupEditorGrass = new DSPRE.Editors.SafariZoneEncounterGroupEditor();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.label1 = new System.Windows.Forms.Label();
this.comboBoxFileID = new System.Windows.Forms.ComboBox();
this.buttonImport = new System.Windows.Forms.Button();
this.tabPageSuperRod.SuspendLayout();
this.tabPageGoodRod.SuspendLayout();
this.tabPageOldRod.SuspendLayout();
this.tabPageSurf.SuspendLayout();
this.tabPageGrass.SuspendLayout();
this.tabControl1.SuspendLayout();
this.SuspendLayout();
//
// buttonSaveAs
//
this.buttonSaveAs.Image = global::DSPRE.Properties.Resources.exportArrow;
this.buttonSaveAs.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonSaveAs.Location = new System.Drawing.Point(238, 14);
this.buttonSaveAs.Name = "buttonSaveAs";
this.buttonSaveAs.Size = new System.Drawing.Size(82, 24);
this.buttonSaveAs.TabIndex = 28;
this.buttonSaveAs.Text = "Export";
this.buttonSaveAs.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonSaveAs.UseVisualStyleBackColor = true;
this.buttonSaveAs.Click += new System.EventHandler(this.buttonSaveAs_Click);
//
// buttonSave
//
this.buttonSave.Image = ((System.Drawing.Image)(resources.GetObject("buttonSave.Image")));
this.buttonSave.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonSave.Location = new System.Drawing.Point(176, 14);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(60, 24);
this.buttonSave.TabIndex = 28;
this.buttonSave.Text = "Save";
this.buttonSave.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
//
// tabPageSuperRod
//
this.tabPageSuperRod.Controls.Add(this.safariZoneEncounterGroupEditorSuperRod);
this.tabPageSuperRod.Location = new System.Drawing.Point(4, 22);
this.tabPageSuperRod.Name = "tabPageSuperRod";
this.tabPageSuperRod.Padding = new System.Windows.Forms.Padding(3);
this.tabPageSuperRod.Size = new System.Drawing.Size(935, 264);
this.tabPageSuperRod.TabIndex = 4;
this.tabPageSuperRod.Text = "Super Rod";
this.tabPageSuperRod.UseVisualStyleBackColor = true;
//
// safariZoneEncounterGroupEditorSuperRod
//
this.safariZoneEncounterGroupEditorSuperRod.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterGroupEditorSuperRod.Name = "safariZoneEncounterGroupEditorSuperRod";
this.safariZoneEncounterGroupEditorSuperRod.Size = new System.Drawing.Size(969, 255);
this.safariZoneEncounterGroupEditorSuperRod.TabIndex = 25;
//
// tabPageGoodRod
//
this.tabPageGoodRod.Controls.Add(this.safariZoneEncounterGroupEditorGoodRod);
this.tabPageGoodRod.Location = new System.Drawing.Point(4, 22);
this.tabPageGoodRod.Name = "tabPageGoodRod";
this.tabPageGoodRod.Padding = new System.Windows.Forms.Padding(3);
this.tabPageGoodRod.Size = new System.Drawing.Size(935, 264);
this.tabPageGoodRod.TabIndex = 3;
this.tabPageGoodRod.Text = "Good Rod";
this.tabPageGoodRod.UseVisualStyleBackColor = true;
//
// safariZoneEncounterGroupEditorGoodRod
//
this.safariZoneEncounterGroupEditorGoodRod.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterGroupEditorGoodRod.Name = "safariZoneEncounterGroupEditorGoodRod";
this.safariZoneEncounterGroupEditorGoodRod.Size = new System.Drawing.Size(969, 255);
this.safariZoneEncounterGroupEditorGoodRod.TabIndex = 25;
//
// tabPageOldRod
//
this.tabPageOldRod.Controls.Add(this.safariZoneEncounterGroupEditorOldRod);
this.tabPageOldRod.Location = new System.Drawing.Point(4, 22);
this.tabPageOldRod.Name = "tabPageOldRod";
this.tabPageOldRod.Padding = new System.Windows.Forms.Padding(3);
this.tabPageOldRod.Size = new System.Drawing.Size(935, 264);
this.tabPageOldRod.TabIndex = 2;
this.tabPageOldRod.Text = "Old Rod";
this.tabPageOldRod.UseVisualStyleBackColor = true;
//
// safariZoneEncounterGroupEditorOldRod
//
this.safariZoneEncounterGroupEditorOldRod.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterGroupEditorOldRod.Name = "safariZoneEncounterGroupEditorOldRod";
this.safariZoneEncounterGroupEditorOldRod.Size = new System.Drawing.Size(969, 255);
this.safariZoneEncounterGroupEditorOldRod.TabIndex = 25;
//
// tabPageSurf
//
this.tabPageSurf.Controls.Add(this.safariZoneEncounterGroupEditorSurf);
this.tabPageSurf.Location = new System.Drawing.Point(4, 22);
this.tabPageSurf.Name = "tabPageSurf";
this.tabPageSurf.Padding = new System.Windows.Forms.Padding(3);
this.tabPageSurf.Size = new System.Drawing.Size(935, 264);
this.tabPageSurf.TabIndex = 1;
this.tabPageSurf.Text = "Surf";
this.tabPageSurf.UseVisualStyleBackColor = true;
//
// safariZoneEncounterGroupEditorSurf
//
this.safariZoneEncounterGroupEditorSurf.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterGroupEditorSurf.Name = "safariZoneEncounterGroupEditorSurf";
this.safariZoneEncounterGroupEditorSurf.Size = new System.Drawing.Size(969, 255);
this.safariZoneEncounterGroupEditorSurf.TabIndex = 25;
//
// tabPageGrass
//
this.tabPageGrass.Controls.Add(this.safariZoneEncounterGroupEditorGrass);
this.tabPageGrass.Location = new System.Drawing.Point(4, 22);
this.tabPageGrass.Name = "tabPageGrass";
this.tabPageGrass.Padding = new System.Windows.Forms.Padding(3);
this.tabPageGrass.Size = new System.Drawing.Size(935, 264);
this.tabPageGrass.TabIndex = 0;
this.tabPageGrass.Text = "Grass";
this.tabPageGrass.UseVisualStyleBackColor = true;
//
// safariZoneEncounterGroupEditorGrass
//
this.safariZoneEncounterGroupEditorGrass.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterGroupEditorGrass.Name = "safariZoneEncounterGroupEditorGrass";
this.safariZoneEncounterGroupEditorGrass.Size = new System.Drawing.Size(969, 255);
this.safariZoneEncounterGroupEditorGrass.TabIndex = 25;
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPageGrass);
this.tabControl1.Controls.Add(this.tabPageSurf);
this.tabControl1.Controls.Add(this.tabPageOldRod);
this.tabControl1.Controls.Add(this.tabPageGoodRod);
this.tabControl1.Controls.Add(this.tabPageSuperRod);
this.tabControl1.Location = new System.Drawing.Point(4, 44);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(943, 290);
this.tabControl1.TabIndex = 27;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(59, 13);
this.label1.TabIndex = 26;
this.label1.Text = "Map Name";
//
// comboBoxFileID
//
this.comboBoxFileID.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxFileID.FormattingEnabled = true;
this.comboBoxFileID.Location = new System.Drawing.Point(3, 16);
this.comboBoxFileID.Name = "comboBoxFileID";
this.comboBoxFileID.Size = new System.Drawing.Size(167, 21);
this.comboBoxFileID.TabIndex = 0;
this.comboBoxFileID.SelectedIndexChanged += new System.EventHandler(this.comboBoxFileID_SelectedIndexChanged);
//
// buttonImport
//
this.buttonImport.Image = global::DSPRE.Properties.Resources.importArrow;
this.buttonImport.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonImport.Location = new System.Drawing.Point(322, 14);
this.buttonImport.Name = "buttonImport";
this.buttonImport.Size = new System.Drawing.Size(82, 24);
this.buttonImport.TabIndex = 28;
this.buttonImport.Text = "Import";
this.buttonImport.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonImport.UseVisualStyleBackColor = true;
this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click);
//
// SafariZoneEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.buttonImport);
this.Controls.Add(this.buttonSaveAs);
this.Controls.Add(this.buttonSave);
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.label1);
this.Controls.Add(this.comboBoxFileID);
this.Name = "SafariZoneEditor";
this.Size = new System.Drawing.Size(953, 340);
this.tabPageSuperRod.ResumeLayout(false);
this.tabPageGoodRod.ResumeLayout(false);
this.tabPageOldRod.ResumeLayout(false);
this.tabPageSurf.ResumeLayout(false);
this.tabPageGrass.ResumeLayout(false);
this.tabControl1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button buttonSaveAs;
private System.Windows.Forms.Button buttonSave;
private System.Windows.Forms.TabPage tabPageSuperRod;
private SafariZoneEncounterGroupEditor safariZoneEncounterGroupEditorSuperRod;
private System.Windows.Forms.TabPage tabPageGoodRod;
private SafariZoneEncounterGroupEditor safariZoneEncounterGroupEditorGoodRod;
private System.Windows.Forms.TabPage tabPageOldRod;
private SafariZoneEncounterGroupEditor safariZoneEncounterGroupEditorOldRod;
private System.Windows.Forms.TabPage tabPageSurf;
private SafariZoneEncounterGroupEditor safariZoneEncounterGroupEditorSurf;
private System.Windows.Forms.TabPage tabPageGrass;
private SafariZoneEncounterGroupEditor safariZoneEncounterGroupEditorGrass;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ComboBox comboBoxFileID;
private System.Windows.Forms.Button buttonImport;
}
}
================================================
FILE: DS_Map/Editors/SafariZoneEditor.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using DSPRE.ROMFiles;
namespace DSPRE.Editors {
public partial class SafariZoneEditor : UserControl {
public bool safariZoneEditorIsReady { get; set; } = false;
private SafariZoneEncounterFile safariZoneEncounterFile;
public SafariZoneEditor() {
InitializeComponent();
}
public void SetupSafariZoneEditor(bool force = false) {
if (safariZoneEditorIsReady && !force){ return; }
safariZoneEditorIsReady = true;
DSUtils.TryUnpackNarcs(new List() {
RomInfo.DirNames.safariZone,
RomInfo.DirNames.textArchives,
});
safariZoneEncounterGroupEditorGrass.SetPokemonNames();
safariZoneEncounterGroupEditorSurf.SetPokemonNames();
safariZoneEncounterGroupEditorOldRod.SetPokemonNames();
safariZoneEncounterGroupEditorGoodRod.SetPokemonNames();
safariZoneEncounterGroupEditorSuperRod.SetPokemonNames();
int safariZoneCount = Filesystem.GetSafariZoneCount();
comboBoxFileID.Items.Clear();
for (int i = 0; i < safariZoneCount; i++) {
comboBoxFileID.Items.Add(SafariZoneEncounterFile.Names[i]);
}
if (comboBoxFileID.Items.Count > 0) {
comboBoxFileID.SelectedIndex = 0;
}
}
private void comboBoxFileID_SelectedIndexChanged(object sender, EventArgs e) {
if (comboBoxFileID.SelectedIndex == -1) {
safariZoneEncounterFile = null;
safariZoneEncounterGroupEditorGrass.Reset();
safariZoneEncounterGroupEditorSurf.Reset();
safariZoneEncounterGroupEditorOldRod.Reset();
safariZoneEncounterGroupEditorGoodRod.Reset();
safariZoneEncounterGroupEditorSuperRod.Reset();
return;
}
safariZoneEncounterFile = new SafariZoneEncounterFile(comboBoxFileID.SelectedIndex);
safariZoneEncounterGroupEditorGrass.SetData(safariZoneEncounterFile.grassEncounterGroup);
safariZoneEncounterGroupEditorSurf.SetData(safariZoneEncounterFile.surfEncounterGroup);
safariZoneEncounterGroupEditorOldRod.SetData(safariZoneEncounterFile.oldRodEncounterGroup);
safariZoneEncounterGroupEditorGoodRod.SetData(safariZoneEncounterFile.goodRodEncounterGroup);
safariZoneEncounterGroupEditorSuperRod.SetData(safariZoneEncounterFile.superRodEncounterGroup);
}
private void buttonSave_Click(object sender, EventArgs e) {
if (safariZoneEncounterFile == null){ return; }
safariZoneEncounterFile.SaveToFile();
}
private void buttonSaveAs_Click(object sender, EventArgs e) {
if (safariZoneEncounterFile == null){ return; }
SaveFileDialog sfd = new SaveFileDialog();
try {
sfd.InitialDirectory = Path.GetDirectoryName(sfd.FileName);
sfd.FileName = Path.GetFileName(sfd.FileName);
}
catch (Exception ex) {
sfd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.UserProfile.ToString());
sfd.FileName = Path.GetFileName(sfd.FileName);
}
if (sfd.ShowDialog() != DialogResult.OK){ return; }
safariZoneEncounterFile.SaveToFile(sfd.FileName);
}
private void buttonImport_Click(object sender, EventArgs e) {
if (safariZoneEncounterFile == null){ return; }
OpenFileDialog ofd = new OpenFileDialog();
try {
ofd.InitialDirectory = Path.GetDirectoryName(ofd.FileName);
ofd.FileName = Path.GetFileName(ofd.FileName);
}
catch (Exception ex) {
ofd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.UserProfile.ToString());
ofd.FileName = Path.GetFileName(ofd.FileName);
}
if (ofd.ShowDialog() != DialogResult.OK){ return; }
safariZoneEncounterFile = new SafariZoneEncounterFile(ofd.FileName);
safariZoneEncounterGroupEditorGrass.SetData(safariZoneEncounterFile.grassEncounterGroup);
safariZoneEncounterGroupEditorSurf.SetData(safariZoneEncounterFile.surfEncounterGroup);
safariZoneEncounterGroupEditorOldRod.SetData(safariZoneEncounterFile.oldRodEncounterGroup);
safariZoneEncounterGroupEditorGoodRod.SetData(safariZoneEncounterFile.goodRodEncounterGroup);
safariZoneEncounterGroupEditorSuperRod.SetData(safariZoneEncounterFile.superRodEncounterGroup);
}
}
}
================================================
FILE: DS_Map/Editors/SafariZoneEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vwAADr8BOAVTJAAAAhRJREFUOE+tkT1ME2EYx2/QQWMiUcDR0dXFmRgSBwOackiIg4uJo1MB+4HAoAzE
RJCQ6OBEIBHUGK0aY4SKg4NTSUxNSutHr9f2vnq9a68f1/593reA2qObb/LL+7yX//PL874n/JfVPf0a
J6YiODYZwZFwZ44SXbcjOEl5ajvU6haELiaY/KhDVTUkJKUjyYwC4W4cwai2J+GrlwlurX6CVTQhGWWk
C2X81GykjRJ+6SWqrVatFHB8/jvCWwZN3CYIkbVk28jZNY5sVpC1qpCLhOnwOqPbOLWQQGBTPWAC+lhx
HIyIPiwtPsDiwjxxH6rTxOjIFV7nrQpOL+1gfEMF69ntbwkmNhTUanUYNUCrAAXaWc0ErNarVJfqOPNo
B2OU9QjGyOq6Td7EwmadJASX0c6/l5s4+zgFP2V7ZtoE4x8UvEuW0WiiI2z1Lf+An7JeAb3B5XUJA2vp
jlxak+B7KvFpDxBo8D2TAZdmrdPMrgt6lH9Y+SJj9IVMAg297YIJ+o1DzzPYTuoITc/iQv955EwXMTpv
p3S+M+m1V1me9QgCUQNXX2YRT1sYHBiEP3wHVbp3PF3cB40GbrzN86xHENrScf1NDsl8FaI4jODMHOgS
SOacfYAmbr5XeNYjGH7yDReXv+JeNIUhUYwFpmZjDz+nMLf5B3b2rcZ5tju4ntjtFw4T54j+v2g/t9NH
9AiCIPwGJelqUAd/T3AAAAAASUVORK5CYII=
================================================
FILE: DS_Map/Editors/SafariZoneEncounterEditorTab.Designer.cs
================================================
namespace DSPRE.Editors
{
partial class SafariZoneEncounterEditorTab
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.numericUpDownLevel = new System.Windows.Forms.NumericUpDown();
this.comboBoxPokemon = new System.Windows.Forms.ComboBox();
this.numericUpDownLevelObject = new System.Windows.Forms.NumericUpDown();
this.comboBoxPokemonObject = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.listBoxEncountersObject = new DSPRE.ListBox2();
this.listBoxEncounters = new DSPRE.ListBox2();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownLevel)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownLevelObject)).BeginInit();
this.SuspendLayout();
//
// numericUpDownLevel
//
this.numericUpDownLevel.Location = new System.Drawing.Point(139, 180);
this.numericUpDownLevel.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownLevel.Name = "numericUpDownLevel";
this.numericUpDownLevel.Size = new System.Drawing.Size(58, 20);
this.numericUpDownLevel.TabIndex = 20;
this.numericUpDownLevel.Value = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownLevel.ValueChanged += new System.EventHandler(this.numericUpDownLevel_ValueChanged);
//
// comboBoxPokemon
//
this.comboBoxPokemon.FormattingEnabled = true;
this.comboBoxPokemon.Location = new System.Drawing.Point(6, 179);
this.comboBoxPokemon.Name = "comboBoxPokemon";
this.comboBoxPokemon.Size = new System.Drawing.Size(127, 21);
this.comboBoxPokemon.TabIndex = 21;
this.comboBoxPokemon.SelectedIndexChanged += new System.EventHandler(this.comboBoxPokemon_SelectedIndexChanged);
//
// numericUpDownLevelObject
//
this.numericUpDownLevelObject.Location = new System.Drawing.Point(339, 180);
this.numericUpDownLevelObject.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownLevelObject.Name = "numericUpDownLevelObject";
this.numericUpDownLevelObject.Size = new System.Drawing.Size(58, 20);
this.numericUpDownLevelObject.TabIndex = 20;
this.numericUpDownLevelObject.Value = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownLevelObject.ValueChanged += new System.EventHandler(this.numericUpDownLevelObject_ValueChanged);
//
// comboBoxPokemonObject
//
this.comboBoxPokemonObject.FormattingEnabled = true;
this.comboBoxPokemonObject.Location = new System.Drawing.Point(206, 179);
this.comboBoxPokemonObject.Name = "comboBoxPokemonObject";
this.comboBoxPokemonObject.Size = new System.Drawing.Size(127, 21);
this.comboBoxPokemonObject.TabIndex = 21;
this.comboBoxPokemonObject.SelectedIndexChanged += new System.EventHandler(this.comboBoxPokemonObject_SelectedIndexChanged);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(86, 13);
this.label2.TabIndex = 22;
this.label2.Text = "Encounter Table";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(203, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(120, 13);
this.label1.TabIndex = 22;
this.label1.Text = "Object Encounter Table";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(136, 163);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(33, 13);
this.label3.TabIndex = 23;
this.label3.Text = "Level";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(3, 163);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(52, 13);
this.label4.TabIndex = 24;
this.label4.Text = "Pokemon";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(203, 163);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(52, 13);
this.label5.TabIndex = 24;
this.label5.Text = "Pokemon";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(336, 163);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(33, 13);
this.label6.TabIndex = 23;
this.label6.Text = "Level";
//
// listBoxEncountersObject
//
this.listBoxEncountersObject.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listBoxEncountersObject.FormattingEnabled = true;
this.listBoxEncountersObject.ItemHeight = 14;
this.listBoxEncountersObject.Location = new System.Drawing.Point(206, 16);
this.listBoxEncountersObject.Name = "listBoxEncountersObject";
this.listBoxEncountersObject.Size = new System.Drawing.Size(191, 144);
this.listBoxEncountersObject.TabIndex = 1;
this.listBoxEncountersObject.SelectedIndexChanged += new System.EventHandler(this.listBoxEncountersObject_SelectedIndexChanged);
//
// listBoxEncounters
//
this.listBoxEncounters.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listBoxEncounters.FormattingEnabled = true;
this.listBoxEncounters.ItemHeight = 14;
this.listBoxEncounters.Location = new System.Drawing.Point(6, 16);
this.listBoxEncounters.Name = "listBoxEncounters";
this.listBoxEncounters.Size = new System.Drawing.Size(191, 144);
this.listBoxEncounters.TabIndex = 1;
this.listBoxEncounters.SelectedIndexChanged += new System.EventHandler(this.listBoxEncounters_SelectedIndexChanged);
//
// SafariZoneEncounterEditorTab
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label6);
this.Controls.Add(this.label3);
this.Controls.Add(this.label5);
this.Controls.Add(this.label4);
this.Controls.Add(this.label1);
this.Controls.Add(this.label2);
this.Controls.Add(this.comboBoxPokemonObject);
this.Controls.Add(this.comboBoxPokemon);
this.Controls.Add(this.numericUpDownLevelObject);
this.Controls.Add(this.numericUpDownLevel);
this.Controls.Add(this.listBoxEncountersObject);
this.Controls.Add(this.listBoxEncounters);
this.Name = "SafariZoneEncounterEditorTab";
this.Size = new System.Drawing.Size(404, 208);
((System.ComponentModel.ISupportInitialize)(this.numericUpDownLevel)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownLevelObject)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
public ListBox2 listBoxEncounters;
public System.Windows.Forms.NumericUpDown numericUpDownLevel;
public System.Windows.Forms.ComboBox comboBoxPokemon;
public ListBox2 listBoxEncountersObject;
public System.Windows.Forms.NumericUpDown numericUpDownLevelObject;
public System.Windows.Forms.ComboBox comboBoxPokemonObject;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
}
}
================================================
FILE: DS_Map/Editors/SafariZoneEncounterEditorTab.cs
================================================
using System;
using System.Windows.Forms;
using DSPRE.ROMFiles;
namespace DSPRE.Editors {
public partial class SafariZoneEncounterEditorTab : UserControl {
public SafariZoneEncounterEditorTab() {
InitializeComponent();
}
private void listBoxEncounters_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneEncounter safariZoneEncounter = (SafariZoneEncounter)listBoxEncounters.SelectedItem;
if (safariZoneEncounter == null){ return; }
comboBoxPokemon.SelectedIndex = safariZoneEncounter.pokemonID;
numericUpDownLevel.Value = safariZoneEncounter.level;
}
private void comboBoxPokemon_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneEncounter safariZoneEncounter = (SafariZoneEncounter)listBoxEncounters.SelectedItem;
if (safariZoneEncounter == null){ return; }
safariZoneEncounter.pokemonID = (ushort)comboBoxPokemon.SelectedIndex;
listBoxEncounters.RefreshItem(listBoxEncounters.SelectedIndex);
}
private void numericUpDownLevel_ValueChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneEncounter safariZoneEncounter = (SafariZoneEncounter)listBoxEncounters.SelectedItem;
if (safariZoneEncounter == null){ return; }
safariZoneEncounter.level = (byte)numericUpDownLevel.Value;
listBoxEncounters.RefreshItem(listBoxEncounters.SelectedIndex);
}
private void listBoxEncountersObject_SelectedIndexChanged(object sender, EventArgs e)
{
if (Helpers.HandlersDisabled){ return; }
SafariZoneEncounter safariZoneEncounter = (SafariZoneEncounter)listBoxEncountersObject.SelectedItem;
if (safariZoneEncounter == null){ return; }
comboBoxPokemonObject.SelectedIndex = safariZoneEncounter.pokemonID;
numericUpDownLevelObject.Value = safariZoneEncounter.level;
}
private void comboBoxPokemonObject_SelectedIndexChanged(object sender, EventArgs e)
{
if (Helpers.HandlersDisabled){ return; }
SafariZoneEncounter safariZoneEncounter = (SafariZoneEncounter)listBoxEncountersObject.SelectedItem;
if (safariZoneEncounter == null){ return; }
safariZoneEncounter.pokemonID = (ushort)comboBoxPokemonObject.SelectedIndex;
listBoxEncountersObject.RefreshItem(listBoxEncountersObject.SelectedIndex);
}
private void numericUpDownLevelObject_ValueChanged(object sender, EventArgs e)
{
if (Helpers.HandlersDisabled){ return; }
SafariZoneEncounter safariZoneEncounter = (SafariZoneEncounter)listBoxEncountersObject.SelectedItem;
if (safariZoneEncounter == null){ return; }
safariZoneEncounter.level = (byte)numericUpDownLevelObject.Value;
listBoxEncountersObject.RefreshItem(listBoxEncountersObject.SelectedIndex);
}
}
}
================================================
FILE: DS_Map/Editors/SafariZoneEncounterEditorTab.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/Editors/SafariZoneEncounterGroupEditor.Designer.cs
================================================
namespace DSPRE.Editors
{
partial class SafariZoneEncounterGroupEditor
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SafariZoneEncounterGroupEditor));
this.tabControlEncounters = new System.Windows.Forms.TabControl();
this.tabPageMorning = new System.Windows.Forms.TabPage();
this.safariZoneEncounterEditorMorningTab = new DSPRE.Editors.SafariZoneEncounterEditorTab();
this.tabPageDay = new System.Windows.Forms.TabPage();
this.safariZoneEncounterEditorDayTab = new DSPRE.Editors.SafariZoneEncounterEditorTab();
this.tabPageNight = new System.Windows.Forms.TabPage();
this.safariZoneEncounterEditorNightTab = new DSPRE.Editors.SafariZoneEncounterEditorTab();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.comboBoxObjectRequirementType = new System.Windows.Forms.ComboBox();
this.numericUpDownObjectRequirementQty = new System.Windows.Forms.NumericUpDown();
this.listBoxObjectRequirements = new DSPRE.ListBox2();
this.listBoxObjectOptionalRequirements = new DSPRE.ListBox2();
this.numericUpDownObjectOptionalRequirementQty = new System.Windows.Forms.NumericUpDown();
this.comboBoxOptionalObjectRequirementType = new System.Windows.Forms.ComboBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.buttonRemoveObjectEncounter = new System.Windows.Forms.Button();
this.buttonAddObjectEncounter = new System.Windows.Forms.Button();
this.tabControlEncounters.SuspendLayout();
this.tabPageMorning.SuspendLayout();
this.tabPageDay.SuspendLayout();
this.tabPageNight.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownObjectRequirementQty)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownObjectOptionalRequirementQty)).BeginInit();
this.SuspendLayout();
//
// tabControlEncounters
//
this.tabControlEncounters.Controls.Add(this.tabPageMorning);
this.tabControlEncounters.Controls.Add(this.tabPageDay);
this.tabControlEncounters.Controls.Add(this.tabPageNight);
this.tabControlEncounters.Location = new System.Drawing.Point(4, 7);
this.tabControlEncounters.Name = "tabControlEncounters";
this.tabControlEncounters.SelectedIndex = 0;
this.tabControlEncounters.Size = new System.Drawing.Size(418, 244);
this.tabControlEncounters.TabIndex = 2;
//
// tabPageMorning
//
this.tabPageMorning.Controls.Add(this.safariZoneEncounterEditorMorningTab);
this.tabPageMorning.Location = new System.Drawing.Point(4, 22);
this.tabPageMorning.Name = "tabPageMorning";
this.tabPageMorning.Padding = new System.Windows.Forms.Padding(3);
this.tabPageMorning.Size = new System.Drawing.Size(410, 218);
this.tabPageMorning.TabIndex = 0;
this.tabPageMorning.Text = "Morning";
this.tabPageMorning.UseVisualStyleBackColor = true;
//
// safariZoneEncounterEditorMorningTab
//
this.safariZoneEncounterEditorMorningTab.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterEditorMorningTab.Name = "safariZoneEncounterEditorMorningTab";
this.safariZoneEncounterEditorMorningTab.Size = new System.Drawing.Size(405, 209);
this.safariZoneEncounterEditorMorningTab.TabIndex = 1;
//
// tabPageDay
//
this.tabPageDay.Controls.Add(this.safariZoneEncounterEditorDayTab);
this.tabPageDay.Location = new System.Drawing.Point(4, 22);
this.tabPageDay.Name = "tabPageDay";
this.tabPageDay.Padding = new System.Windows.Forms.Padding(3);
this.tabPageDay.Size = new System.Drawing.Size(410, 218);
this.tabPageDay.TabIndex = 1;
this.tabPageDay.Text = "Day";
this.tabPageDay.UseVisualStyleBackColor = true;
//
// safariZoneEncounterEditorDayTab
//
this.safariZoneEncounterEditorDayTab.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterEditorDayTab.Name = "safariZoneEncounterEditorDayTab";
this.safariZoneEncounterEditorDayTab.Size = new System.Drawing.Size(401, 206);
this.safariZoneEncounterEditorDayTab.TabIndex = 1;
//
// tabPageNight
//
this.tabPageNight.Controls.Add(this.safariZoneEncounterEditorNightTab);
this.tabPageNight.Location = new System.Drawing.Point(4, 22);
this.tabPageNight.Name = "tabPageNight";
this.tabPageNight.Padding = new System.Windows.Forms.Padding(3);
this.tabPageNight.Size = new System.Drawing.Size(410, 218);
this.tabPageNight.TabIndex = 2;
this.tabPageNight.Text = "Night";
this.tabPageNight.UseVisualStyleBackColor = true;
//
// safariZoneEncounterEditorNightTab
//
this.safariZoneEncounterEditorNightTab.Location = new System.Drawing.Point(6, 6);
this.safariZoneEncounterEditorNightTab.Name = "safariZoneEncounterEditorNightTab";
this.safariZoneEncounterEditorNightTab.Size = new System.Drawing.Size(401, 206);
this.safariZoneEncounterEditorNightTab.TabIndex = 1;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(657, 198);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(23, 13);
this.label3.TabIndex = 29;
this.label3.Text = "Qty";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(524, 198);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(31, 13);
this.label4.TabIndex = 30;
this.label4.Text = "Type";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(524, 35);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(133, 13);
this.label2.TabIndex = 28;
this.label2.Text = "Object Type Requirements";
//
// comboBoxObjectRequirementType
//
this.comboBoxObjectRequirementType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxObjectRequirementType.FormattingEnabled = true;
this.comboBoxObjectRequirementType.Location = new System.Drawing.Point(527, 214);
this.comboBoxObjectRequirementType.Name = "comboBoxObjectRequirementType";
this.comboBoxObjectRequirementType.Size = new System.Drawing.Size(127, 21);
this.comboBoxObjectRequirementType.TabIndex = 27;
this.comboBoxObjectRequirementType.SelectedIndexChanged += new System.EventHandler(this.comboBoxObjectRequirementType_SelectedIndexChanged);
//
// numericUpDownObjectRequirementQty
//
this.numericUpDownObjectRequirementQty.Location = new System.Drawing.Point(660, 215);
this.numericUpDownObjectRequirementQty.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownObjectRequirementQty.Name = "numericUpDownObjectRequirementQty";
this.numericUpDownObjectRequirementQty.Size = new System.Drawing.Size(58, 20);
this.numericUpDownObjectRequirementQty.TabIndex = 26;
this.numericUpDownObjectRequirementQty.Value = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDownObjectRequirementQty.ValueChanged += new System.EventHandler(this.numericUpDownObjectRequirementQty_ValueChanged);
//
// listBoxObjectRequirements
//
this.listBoxObjectRequirements.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listBoxObjectRequirements.FormattingEnabled = true;
this.listBoxObjectRequirements.ItemHeight = 14;
this.listBoxObjectRequirements.Location = new System.Drawing.Point(527, 51);
this.listBoxObjectRequirements.Name = "listBoxObjectRequirements";
this.listBoxObjectRequirements.Size = new System.Drawing.Size(191, 144);
this.listBoxObjectRequirements.TabIndex = 25;
this.listBoxObjectRequirements.SelectedIndexChanged += new System.EventHandler(this.listBoxObjectRequirements_SelectedIndexChanged);
//
// listBoxObjectOptionalRequirements
//
this.listBoxObjectOptionalRequirements.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listBoxObjectOptionalRequirements.FormattingEnabled = true;
this.listBoxObjectOptionalRequirements.ItemHeight = 14;
this.listBoxObjectOptionalRequirements.Location = new System.Drawing.Point(724, 51);
this.listBoxObjectOptionalRequirements.Name = "listBoxObjectOptionalRequirements";
this.listBoxObjectOptionalRequirements.Size = new System.Drawing.Size(191, 144);
this.listBoxObjectOptionalRequirements.TabIndex = 25;
this.listBoxObjectOptionalRequirements.SelectedIndexChanged += new System.EventHandler(this.listBoxObjectOptionalRequirements_SelectedIndexChanged);
//
// numericUpDownObjectOptionalRequirementQty
//
this.numericUpDownObjectOptionalRequirementQty.Location = new System.Drawing.Point(857, 215);
this.numericUpDownObjectOptionalRequirementQty.Name = "numericUpDownObjectOptionalRequirementQty";
this.numericUpDownObjectOptionalRequirementQty.Size = new System.Drawing.Size(58, 20);
this.numericUpDownObjectOptionalRequirementQty.TabIndex = 26;
this.numericUpDownObjectOptionalRequirementQty.ValueChanged += new System.EventHandler(this.numericUpDownObjectOptionalRequirementQty_ValueChanged);
//
// comboBoxOptionalObjectRequirementType
//
this.comboBoxOptionalObjectRequirementType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxOptionalObjectRequirementType.FormattingEnabled = true;
this.comboBoxOptionalObjectRequirementType.Location = new System.Drawing.Point(724, 214);
this.comboBoxOptionalObjectRequirementType.Name = "comboBoxOptionalObjectRequirementType";
this.comboBoxOptionalObjectRequirementType.Size = new System.Drawing.Size(127, 21);
this.comboBoxOptionalObjectRequirementType.TabIndex = 27;
this.comboBoxOptionalObjectRequirementType.SelectedIndexChanged += new System.EventHandler(this.comboBoxOptionalObjectRequirementType_SelectedIndexChanged);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(721, 35);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(175, 13);
this.label5.TabIndex = 28;
this.label5.Text = "Optional Object Type Requirements";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(721, 198);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(31, 13);
this.label6.TabIndex = 30;
this.label6.Text = "Type";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(854, 198);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(23, 13);
this.label7.TabIndex = 29;
this.label7.Text = "Qty";
//
// buttonRemoveObjectEncounter
//
this.buttonRemoveObjectEncounter.Image = global::DSPRE.Properties.Resources.deleteIcon;
this.buttonRemoveObjectEncounter.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonRemoveObjectEncounter.Location = new System.Drawing.Point(424, 77);
this.buttonRemoveObjectEncounter.Name = "buttonRemoveObjectEncounter";
this.buttonRemoveObjectEncounter.Size = new System.Drawing.Size(97, 55);
this.buttonRemoveObjectEncounter.TabIndex = 31;
this.buttonRemoveObjectEncounter.Text = "Remove Last Object Encounter";
this.buttonRemoveObjectEncounter.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonRemoveObjectEncounter.UseVisualStyleBackColor = true;
this.buttonRemoveObjectEncounter.Click += new System.EventHandler(this.buttonRemoveObjectEncounter_Click);
//
// buttonAddObjectEncounter
//
this.buttonAddObjectEncounter.Image = ((System.Drawing.Image)(resources.GetObject("buttonAddObjectEncounter.Image")));
this.buttonAddObjectEncounter.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonAddObjectEncounter.Location = new System.Drawing.Point(424, 32);
this.buttonAddObjectEncounter.Name = "buttonAddObjectEncounter";
this.buttonAddObjectEncounter.Size = new System.Drawing.Size(97, 39);
this.buttonAddObjectEncounter.TabIndex = 31;
this.buttonAddObjectEncounter.Text = "Add Object Encounter";
this.buttonAddObjectEncounter.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonAddObjectEncounter.UseVisualStyleBackColor = true;
this.buttonAddObjectEncounter.Click += new System.EventHandler(this.buttonAddObjectEncounter_Click);
//
// SafariZoneEncounterGroupEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.buttonAddObjectEncounter);
this.Controls.Add(this.buttonRemoveObjectEncounter);
this.Controls.Add(this.label7);
this.Controls.Add(this.label3);
this.Controls.Add(this.label6);
this.Controls.Add(this.label4);
this.Controls.Add(this.tabControlEncounters);
this.Controls.Add(this.label5);
this.Controls.Add(this.comboBoxOptionalObjectRequirementType);
this.Controls.Add(this.label2);
this.Controls.Add(this.comboBoxObjectRequirementType);
this.Controls.Add(this.numericUpDownObjectOptionalRequirementQty);
this.Controls.Add(this.listBoxObjectOptionalRequirements);
this.Controls.Add(this.numericUpDownObjectRequirementQty);
this.Controls.Add(this.listBoxObjectRequirements);
this.Name = "SafariZoneEncounterGroupEditor";
this.Size = new System.Drawing.Size(927, 257);
this.tabControlEncounters.ResumeLayout(false);
this.tabPageMorning.ResumeLayout(false);
this.tabPageDay.ResumeLayout(false);
this.tabPageNight.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.numericUpDownObjectRequirementQty)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownObjectOptionalRequirementQty)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TabControl tabControlEncounters;
private System.Windows.Forms.TabPage tabPageMorning;
private System.Windows.Forms.TabPage tabPageDay;
private System.Windows.Forms.TabPage tabPageNight;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label2;
public System.Windows.Forms.ComboBox comboBoxObjectRequirementType;
public System.Windows.Forms.NumericUpDown numericUpDownObjectRequirementQty;
public ListBox2 listBoxObjectRequirements;
public ListBox2 listBoxObjectOptionalRequirements;
public System.Windows.Forms.NumericUpDown numericUpDownObjectOptionalRequirementQty;
public System.Windows.Forms.ComboBox comboBoxOptionalObjectRequirementType;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label7;
public SafariZoneEncounterEditorTab safariZoneEncounterEditorMorningTab;
public SafariZoneEncounterEditorTab safariZoneEncounterEditorDayTab;
public SafariZoneEncounterEditorTab safariZoneEncounterEditorNightTab;
private System.Windows.Forms.Button buttonRemoveObjectEncounter;
private System.Windows.Forms.Button buttonAddObjectEncounter;
}
}
================================================
FILE: DS_Map/Editors/SafariZoneEncounterGroupEditor.cs
================================================
using System;
using System.Windows.Forms;
using DSPRE.ROMFiles;
namespace DSPRE.Editors {
public partial class SafariZoneEncounterGroupEditor : UserControl {
private SafariZoneEncounterGroup safariZoneEncounterGroup;
public SafariZoneEncounterGroupEditor() {
InitializeComponent();
safariZoneEncounterEditorMorningTab.listBoxEncountersObject.SelectedIndexChanged += ListBoxEncountersObject_SelectedIndexChanged;
safariZoneEncounterEditorDayTab.listBoxEncountersObject.SelectedIndexChanged += ListBoxEncountersObject_SelectedIndexChanged;
safariZoneEncounterEditorNightTab.listBoxEncountersObject.SelectedIndexChanged += ListBoxEncountersObject_SelectedIndexChanged;
listBoxObjectRequirements.SelectedIndexChanged += ListBoxEncountersObject_SelectedIndexChanged;
listBoxObjectOptionalRequirements.SelectedIndexChanged += ListBoxEncountersObject_SelectedIndexChanged;
}
private void ListBoxEncountersObject_SelectedIndexChanged(object sender, EventArgs e) {
try {
ListBox2 s = sender as ListBox2;
safariZoneEncounterEditorMorningTab.listBoxEncountersObject.SelectedIndex = s.SelectedIndex;
safariZoneEncounterEditorDayTab.listBoxEncountersObject.SelectedIndex = s.SelectedIndex;
safariZoneEncounterEditorNightTab.listBoxEncountersObject.SelectedIndex = s.SelectedIndex;
listBoxObjectRequirements.SelectedIndex = s.SelectedIndex;
listBoxObjectOptionalRequirements.SelectedIndex = s.SelectedIndex;
}
catch (Exception ex) {
}
}
public void SetPokemonNames() {
string[] pokemonNames = RomInfo.GetPokemonNames();
safariZoneEncounterEditorMorningTab.comboBoxPokemon.Items.AddRange(pokemonNames);
safariZoneEncounterEditorMorningTab.comboBoxPokemonObject.Items.AddRange(pokemonNames);
safariZoneEncounterEditorDayTab.comboBoxPokemon.Items.AddRange(pokemonNames);
safariZoneEncounterEditorDayTab.comboBoxPokemonObject.Items.AddRange(pokemonNames);
safariZoneEncounterEditorNightTab.comboBoxPokemon.Items.AddRange(pokemonNames);
safariZoneEncounterEditorNightTab.comboBoxPokemonObject.Items.AddRange(pokemonNames);
foreach (string type in SafariZoneObjectRequirement.ObjectTypes.Values) {
comboBoxObjectRequirementType.Items.Add(type);
comboBoxOptionalObjectRequirementType.Items.Add(type);
}
}
public void Reset() {
this.safariZoneEncounterGroup = null;
safariZoneEncounterEditorMorningTab.listBoxEncounters.DataSource = null;
safariZoneEncounterEditorDayTab.listBoxEncounters.DataSource = null;
safariZoneEncounterEditorNightTab.listBoxEncounters.DataSource = null;
safariZoneEncounterEditorMorningTab.listBoxEncountersObject.DataSource = null;
safariZoneEncounterEditorDayTab.listBoxEncountersObject.DataSource = null;
safariZoneEncounterEditorNightTab.listBoxEncountersObject.DataSource = null;
listBoxObjectRequirements.DataSource = null;
listBoxObjectOptionalRequirements.DataSource = null;
}
public void SetData(SafariZoneEncounterGroup safariZoneEncounterGroup) {
this.safariZoneEncounterGroup = safariZoneEncounterGroup;
safariZoneEncounterEditorMorningTab.listBoxEncounters.DataSource = this.safariZoneEncounterGroup.MorningEncounters;
safariZoneEncounterEditorDayTab.listBoxEncounters.DataSource = this.safariZoneEncounterGroup.DayEncounters;
safariZoneEncounterEditorNightTab.listBoxEncounters.DataSource = this.safariZoneEncounterGroup.NightEncounters;
safariZoneEncounterEditorMorningTab.listBoxEncountersObject.DataSource = this.safariZoneEncounterGroup.MorningEncountersObject;
safariZoneEncounterEditorDayTab.listBoxEncountersObject.DataSource = this.safariZoneEncounterGroup.DayEncountersObject;
safariZoneEncounterEditorNightTab.listBoxEncountersObject.DataSource = this.safariZoneEncounterGroup.NightEncountersObject;
listBoxObjectRequirements.DataSource = this.safariZoneEncounterGroup.ObjectRequirements;
listBoxObjectOptionalRequirements.DataSource = this.safariZoneEncounterGroup.OptionalObjectRequirements;
}
private void listBoxObjectRequirements_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneObjectRequirement safariZoneObjectRequirement = (SafariZoneObjectRequirement)listBoxObjectRequirements.SelectedItem;
if (safariZoneObjectRequirement == null){ return; }
comboBoxObjectRequirementType.SelectedIndex = safariZoneObjectRequirement.typeID;
numericUpDownObjectRequirementQty.Value = safariZoneObjectRequirement.quantity;
}
private void comboBoxObjectRequirementType_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
// if (comboBoxObjectRequirementType.SelectedIndex == 0){ comboBoxObjectRequirementType.SelectedIndex = 1; } //no requirement is not valid
SafariZoneObjectRequirement safariZoneObjectRequirement = (SafariZoneObjectRequirement)listBoxObjectRequirements.SelectedItem;
if (safariZoneObjectRequirement == null){ return; }
safariZoneObjectRequirement.typeID = (byte)comboBoxObjectRequirementType.SelectedIndex;
listBoxObjectRequirements.RefreshItem(listBoxObjectRequirements.SelectedIndex);
}
private void numericUpDownObjectRequirementQty_ValueChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneObjectRequirement safariZoneObjectRequirement = (SafariZoneObjectRequirement)listBoxObjectRequirements.SelectedItem;
if (safariZoneObjectRequirement == null){ return; }
safariZoneObjectRequirement.quantity = (byte)numericUpDownObjectRequirementQty.Value;
listBoxObjectRequirements.RefreshItem(listBoxObjectRequirements.SelectedIndex);
}
private void listBoxObjectOptionalRequirements_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneObjectRequirement safariZoneObjectRequirement = (SafariZoneObjectRequirement)listBoxObjectOptionalRequirements.SelectedItem;
if (safariZoneObjectRequirement == null){ return; }
comboBoxOptionalObjectRequirementType.SelectedIndex = safariZoneObjectRequirement.typeID;
numericUpDownObjectOptionalRequirementQty.Value = safariZoneObjectRequirement.quantity;
}
private void comboBoxOptionalObjectRequirementType_SelectedIndexChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneObjectRequirement safariZoneObjectRequirement = (SafariZoneObjectRequirement)listBoxObjectOptionalRequirements.SelectedItem;
if (safariZoneObjectRequirement == null){ return; }
safariZoneObjectRequirement.typeID = (byte)comboBoxOptionalObjectRequirementType.SelectedIndex;
listBoxObjectOptionalRequirements.RefreshItem(listBoxObjectOptionalRequirements.SelectedIndex);
}
private void numericUpDownObjectOptionalRequirementQty_ValueChanged(object sender, EventArgs e) {
if (Helpers.HandlersDisabled){ return; }
SafariZoneObjectRequirement safariZoneObjectRequirement = (SafariZoneObjectRequirement)listBoxObjectOptionalRequirements.SelectedItem;
if (safariZoneObjectRequirement == null){ return; }
safariZoneObjectRequirement.quantity = (byte)numericUpDownObjectOptionalRequirementQty.Value;
listBoxObjectOptionalRequirements.RefreshItem(listBoxObjectOptionalRequirements.SelectedIndex);
}
private void buttonAddObjectEncounter_Click(object sender, EventArgs e) {
if (this.safariZoneEncounterGroup == null){ return; }
if (listBoxObjectOptionalRequirements.SelectedIndex == -1){ return; }
safariZoneEncounterGroup.MorningEncountersObject.Add(new SafariZoneEncounter());
safariZoneEncounterGroup.DayEncountersObject.Add(new SafariZoneEncounter());
safariZoneEncounterGroup.NightEncountersObject.Add(new SafariZoneEncounter());
safariZoneEncounterGroup.ObjectRequirements.Add(new SafariZoneObjectRequirement(1, 1));
safariZoneEncounterGroup.OptionalObjectRequirements.Add(new SafariZoneObjectRequirement(0, 0));
safariZoneEncounterGroup.ObjectSlots = (byte)safariZoneEncounterGroup.ObjectRequirements.Count; //all the list counts should be the same
}
private void buttonRemoveObjectEncounter_Click(object sender, EventArgs e) {
if (this.safariZoneEncounterGroup == null){ return; }
if (listBoxObjectOptionalRequirements.SelectedIndex == -1){ return; }
safariZoneEncounterGroup.MorningEncountersObject.RemoveAt(safariZoneEncounterGroup.MorningEncountersObject.Count - 1);
safariZoneEncounterGroup.DayEncountersObject.RemoveAt(safariZoneEncounterGroup.DayEncountersObject.Count - 1);
safariZoneEncounterGroup.NightEncountersObject.RemoveAt(safariZoneEncounterGroup.NightEncountersObject.Count - 1);
safariZoneEncounterGroup.ObjectRequirements.RemoveAt(safariZoneEncounterGroup.ObjectRequirements.Count - 1);
safariZoneEncounterGroup.OptionalObjectRequirements.RemoveAt(safariZoneEncounterGroup.OptionalObjectRequirements.Count - 1);
safariZoneEncounterGroup.ObjectSlots = (byte)safariZoneEncounterGroup.ObjectRequirements.Count; //all the list counts should be the same
}
}
}
================================================
FILE: DS_Map/Editors/SafariZoneEncounterGroupEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wAAADsABataJCQAAAGJJREFUOE9j+P//P1bMMEXuHxD/Z5gm+x/ExqYGhLEKgjDYgAUK/8F41AD8BoAV
gkIbAwNDH24AJCawYhSFpGJQFFPBACzOAmMkg/F5AVvAgDBYEm7AaEIi3wBEwsJhwH8GAOQLbolFp0OS
AAAAAElFTkSuQmCC
================================================
FILE: DS_Map/Editors/ScriptEditor.Designer.cs
================================================
namespace DSPRE.Editors
{
partial class ScriptEditor
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
this.selectScriptFileComboBox = new System.Windows.Forms.ComboBox();
this.label5 = new System.Windows.Forms.Label();
this.scriptEditorTabControl = new System.Windows.Forms.TabControl();
this.scriptsTabPage = new System.Windows.Forms.TabPage();
this.PanelSearchScripts = new System.Windows.Forms.Panel();
this.BtnNextFindScript = new System.Windows.Forms.Button();
this.BtnPrevFindScript = new System.Windows.Forms.Button();
this.BtnCloseFindScript = new System.Windows.Forms.Button();
this.panelFindScriptTextBox = new System.Windows.Forms.TextBox();
this.scintillaScriptsPanel = new System.Windows.Forms.Panel();
this.functionsTabPage = new System.Windows.Forms.TabPage();
this.PanelSearchFunctions = new System.Windows.Forms.Panel();
this.BtnNextFindFunc = new System.Windows.Forms.Button();
this.BtnPrevFindFunc = new System.Windows.Forms.Button();
this.BtnCloseFindFunc = new System.Windows.Forms.Button();
this.panelFindFunctionTextBox = new System.Windows.Forms.TextBox();
this.scintillaFunctionsPanel = new System.Windows.Forms.Panel();
this.actionsTabPage = new System.Windows.Forms.TabPage();
this.PanelSearchActions = new System.Windows.Forms.Panel();
this.BtnNextFindActions = new System.Windows.Forms.Button();
this.BtnPrevFindActions = new System.Windows.Forms.Button();
this.BtnCloseFindActions = new System.Windows.Forms.Button();
this.panelFindActionTextBox = new System.Windows.Forms.TextBox();
this.scintillaActionsPanel = new System.Windows.Forms.Panel();
this.addScriptFileButton = new System.Windows.Forms.Button();
this.removeScriptFileButton = new System.Windows.Forms.Button();
this.saveScriptFileButton = new System.Windows.Forms.Button();
this.exportScriptFileButton = new System.Windows.Forms.Button();
this.importScriptFileButton = new System.Windows.Forms.Button();
this.groupBox8 = new System.Windows.Forms.GroupBox();
this.searchInScriptsButton = new System.Windows.Forms.Button();
this.searchOnlyCurrentScriptCheckBox = new System.Windows.Forms.CheckBox();
this.scrollToBlockStartcheckBox = new System.Windows.Forms.CheckBox();
this.scriptSearchCaseSensitiveCheckBox = new System.Windows.Forms.CheckBox();
this.searchInScriptsTextBox = new System.Windows.Forms.TextBox();
this.label31 = new System.Windows.Forms.Label();
this.searchProgressBar = new System.Windows.Forms.ProgressBar();
this.label30 = new System.Windows.Forms.Label();
this.label29 = new System.Windows.Forms.Label();
this.searchInScriptsResultListBox = new System.Windows.Forms.ListBox();
this.groupBox24 = new System.Windows.Forms.GroupBox();
this.ScriptNavigatorTabControl = new System.Windows.Forms.TabControl();
this.ScriptsNavTab = new System.Windows.Forms.TabPage();
this.scriptsNavListbox = new System.Windows.Forms.ListBox();
this.FunctionsNavTab = new System.Windows.Forms.TabPage();
this.functionsNavListbox = new System.Windows.Forms.ListBox();
this.ActionsNavTab = new System.Windows.Forms.TabPage();
this.actionsNavListbox = new System.Windows.Forms.ListBox();
this.openFindScriptEditorButton = new System.Windows.Forms.Button();
this.expandScriptTextButton = new System.Windows.Forms.Button();
this.compressScriptTextButton = new System.Windows.Forms.Button();
this.scriptEditorWordWrapCheckbox = new System.Windows.Forms.CheckBox();
this.scriptEditorWhitespacesCheckbox = new System.Windows.Forms.CheckBox();
this.groupBox26 = new System.Windows.Forms.GroupBox();
this.scriptEditorNumberFormatNoPreference = new System.Windows.Forms.RadioButton();
this.scriptEditorNumberFormatDecimal = new System.Windows.Forms.RadioButton();
this.scriptEditorNumberFormatHex = new System.Windows.Forms.RadioButton();
this.viewLevelScriptButton = new System.Windows.Forms.Button();
this.locateCurrentScriptFile = new System.Windows.Forms.Button();
this.scriptEditorTabControl.SuspendLayout();
this.scriptsTabPage.SuspendLayout();
this.PanelSearchScripts.SuspendLayout();
this.functionsTabPage.SuspendLayout();
this.PanelSearchFunctions.SuspendLayout();
this.actionsTabPage.SuspendLayout();
this.PanelSearchActions.SuspendLayout();
this.groupBox8.SuspendLayout();
this.groupBox24.SuspendLayout();
this.ScriptNavigatorTabControl.SuspendLayout();
this.ScriptsNavTab.SuspendLayout();
this.FunctionsNavTab.SuspendLayout();
this.ActionsNavTab.SuspendLayout();
this.groupBox26.SuspendLayout();
this.SuspendLayout();
//
// selectScriptFileComboBox
//
this.selectScriptFileComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.selectScriptFileComboBox.FormattingEnabled = true;
this.selectScriptFileComboBox.Location = new System.Drawing.Point(7, 24);
this.selectScriptFileComboBox.Name = "selectScriptFileComboBox";
this.selectScriptFileComboBox.Size = new System.Drawing.Size(152, 21);
this.selectScriptFileComboBox.TabIndex = 0;
this.selectScriptFileComboBox.SelectedIndexChanged += new System.EventHandler(this.selectScriptFileComboBox_SelectedIndexChanged);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(5, 8);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(53, 13);
this.label5.TabIndex = 1;
this.label5.Text = "Script File";
//
// scriptEditorTabControl
//
this.scriptEditorTabControl.Controls.Add(this.scriptsTabPage);
this.scriptEditorTabControl.Controls.Add(this.functionsTabPage);
this.scriptEditorTabControl.Controls.Add(this.actionsTabPage);
this.scriptEditorTabControl.Location = new System.Drawing.Point(481, 22);
this.scriptEditorTabControl.Name = "scriptEditorTabControl";
this.scriptEditorTabControl.SelectedIndex = 0;
this.scriptEditorTabControl.Size = new System.Drawing.Size(692, 591);
this.scriptEditorTabControl.TabIndex = 18;
this.scriptEditorTabControl.SelectedIndexChanged += new System.EventHandler(this.scriptEditorTabControl_TabIndexChanged);
//
// scriptsTabPage
//
this.scriptsTabPage.Controls.Add(this.PanelSearchScripts);
this.scriptsTabPage.Controls.Add(this.scintillaScriptsPanel);
this.scriptsTabPage.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.scriptsTabPage.Location = new System.Drawing.Point(4, 22);
this.scriptsTabPage.Name = "scriptsTabPage";
this.scriptsTabPage.Padding = new System.Windows.Forms.Padding(3);
this.scriptsTabPage.Size = new System.Drawing.Size(684, 565);
this.scriptsTabPage.TabIndex = 0;
this.scriptsTabPage.Text = "Scripts";
this.scriptsTabPage.UseVisualStyleBackColor = true;
//
// PanelSearchScripts
//
this.PanelSearchScripts.BackColor = System.Drawing.Color.White;
this.PanelSearchScripts.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.PanelSearchScripts.Controls.Add(this.BtnNextFindScript);
this.PanelSearchScripts.Controls.Add(this.BtnPrevFindScript);
this.PanelSearchScripts.Controls.Add(this.BtnCloseFindScript);
this.PanelSearchScripts.Controls.Add(this.panelFindScriptTextBox);
this.PanelSearchScripts.Location = new System.Drawing.Point(386, 3);
this.PanelSearchScripts.Name = "PanelSearchScripts";
this.PanelSearchScripts.Size = new System.Drawing.Size(292, 40);
this.PanelSearchScripts.TabIndex = 14;
this.PanelSearchScripts.Visible = false;
//
// BtnNextFindScript
//
this.BtnNextFindScript.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnNextFindScript.ForeColor = System.Drawing.Color.White;
this.BtnNextFindScript.Image = global::DSPRE.Properties.Resources.arrowdown;
this.BtnNextFindScript.Location = new System.Drawing.Point(233, 4);
this.BtnNextFindScript.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnNextFindScript.Name = "BtnNextFindScript";
this.BtnNextFindScript.Size = new System.Drawing.Size(25, 30);
this.BtnNextFindScript.TabIndex = 32;
this.BtnNextFindScript.Tag = "Find next (Enter)";
this.BtnNextFindScript.UseVisualStyleBackColor = true;
this.BtnNextFindScript.Click += new System.EventHandler(this.BtnNextFindScript_Click);
//
// BtnPrevFindScript
//
this.BtnPrevFindScript.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnPrevFindScript.ForeColor = System.Drawing.Color.White;
this.BtnPrevFindScript.Image = global::DSPRE.Properties.Resources.arrowup;
this.BtnPrevFindScript.Location = new System.Drawing.Point(205, 4);
this.BtnPrevFindScript.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnPrevFindScript.Name = "BtnPrevFindScript";
this.BtnPrevFindScript.Size = new System.Drawing.Size(25, 30);
this.BtnPrevFindScript.TabIndex = 31;
this.BtnPrevFindScript.Tag = "Find previous (Shift+Enter)";
this.BtnPrevFindScript.UseVisualStyleBackColor = true;
this.BtnPrevFindScript.Click += new System.EventHandler(this.BtnPrevFindScript_Click);
//
// BtnCloseFindScript
//
this.BtnCloseFindScript.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnCloseFindScript.ForeColor = System.Drawing.Color.White;
this.BtnCloseFindScript.Image = global::DSPRE.Properties.Resources.Cross;
this.BtnCloseFindScript.Location = new System.Drawing.Point(261, 4);
this.BtnCloseFindScript.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnCloseFindScript.Name = "BtnCloseFindScript";
this.BtnCloseFindScript.Size = new System.Drawing.Size(25, 30);
this.BtnCloseFindScript.TabIndex = 33;
this.BtnCloseFindScript.Tag = "Close (Esc)";
this.BtnCloseFindScript.UseVisualStyleBackColor = true;
this.BtnCloseFindScript.Click += new System.EventHandler(this.BtnCloseFindScript_Click);
//
// panelFindScriptTextBox
//
this.panelFindScriptTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.panelFindScriptTextBox.Font = new System.Drawing.Font("Segoe UI", 13.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.panelFindScriptTextBox.Location = new System.Drawing.Point(10, 6);
this.panelFindScriptTextBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panelFindScriptTextBox.Name = "panelFindScriptTextBox";
this.panelFindScriptTextBox.Size = new System.Drawing.Size(189, 25);
this.panelFindScriptTextBox.TabIndex = 30;
this.panelFindScriptTextBox.TextChanged += new System.EventHandler(this.panelFindScriptTextBox_TextChanged);
this.panelFindScriptTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.scriptTxtFind_KeyDown);
//
// scintillaScriptsPanel
//
this.scintillaScriptsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.scintillaScriptsPanel.Location = new System.Drawing.Point(3, 3);
this.scintillaScriptsPanel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.scintillaScriptsPanel.Name = "scintillaScriptsPanel";
this.scintillaScriptsPanel.Size = new System.Drawing.Size(678, 559);
this.scintillaScriptsPanel.TabIndex = 19;
//
// functionsTabPage
//
this.functionsTabPage.Controls.Add(this.PanelSearchFunctions);
this.functionsTabPage.Controls.Add(this.scintillaFunctionsPanel);
this.functionsTabPage.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.functionsTabPage.Location = new System.Drawing.Point(4, 22);
this.functionsTabPage.Name = "functionsTabPage";
this.functionsTabPage.Padding = new System.Windows.Forms.Padding(3);
this.functionsTabPage.Size = new System.Drawing.Size(684, 565);
this.functionsTabPage.TabIndex = 1;
this.functionsTabPage.Text = "Functions";
this.functionsTabPage.UseVisualStyleBackColor = true;
//
// PanelSearchFunctions
//
this.PanelSearchFunctions.BackColor = System.Drawing.Color.White;
this.PanelSearchFunctions.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.PanelSearchFunctions.Controls.Add(this.BtnNextFindFunc);
this.PanelSearchFunctions.Controls.Add(this.BtnPrevFindFunc);
this.PanelSearchFunctions.Controls.Add(this.BtnCloseFindFunc);
this.PanelSearchFunctions.Controls.Add(this.panelFindFunctionTextBox);
this.PanelSearchFunctions.Location = new System.Drawing.Point(386, 3);
this.PanelSearchFunctions.Name = "PanelSearchFunctions";
this.PanelSearchFunctions.Size = new System.Drawing.Size(292, 40);
this.PanelSearchFunctions.TabIndex = 16;
this.PanelSearchFunctions.Visible = false;
//
// BtnNextFindFunc
//
this.BtnNextFindFunc.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnNextFindFunc.ForeColor = System.Drawing.Color.White;
this.BtnNextFindFunc.Image = global::DSPRE.Properties.Resources.arrowdown;
this.BtnNextFindFunc.Location = new System.Drawing.Point(233, 4);
this.BtnNextFindFunc.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnNextFindFunc.Name = "BtnNextFindFunc";
this.BtnNextFindFunc.Size = new System.Drawing.Size(25, 30);
this.BtnNextFindFunc.TabIndex = 36;
this.BtnNextFindFunc.Tag = "Find next (Enter)";
this.BtnNextFindFunc.UseVisualStyleBackColor = true;
this.BtnNextFindFunc.Click += new System.EventHandler(this.BtnNextFindFunc_Click);
//
// BtnPrevFindFunc
//
this.BtnPrevFindFunc.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnPrevFindFunc.ForeColor = System.Drawing.Color.White;
this.BtnPrevFindFunc.Image = global::DSPRE.Properties.Resources.arrowup;
this.BtnPrevFindFunc.Location = new System.Drawing.Point(205, 4);
this.BtnPrevFindFunc.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnPrevFindFunc.Name = "BtnPrevFindFunc";
this.BtnPrevFindFunc.Size = new System.Drawing.Size(25, 30);
this.BtnPrevFindFunc.TabIndex = 35;
this.BtnPrevFindFunc.Tag = "Find previous (Shift+Enter)";
this.BtnPrevFindFunc.UseVisualStyleBackColor = true;
this.BtnPrevFindFunc.Click += new System.EventHandler(this.BtnPrevFindFunc_Click);
//
// BtnCloseFindFunc
//
this.BtnCloseFindFunc.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnCloseFindFunc.ForeColor = System.Drawing.Color.White;
this.BtnCloseFindFunc.Image = global::DSPRE.Properties.Resources.Cross;
this.BtnCloseFindFunc.Location = new System.Drawing.Point(261, 4);
this.BtnCloseFindFunc.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnCloseFindFunc.Name = "BtnCloseFindFunc";
this.BtnCloseFindFunc.Size = new System.Drawing.Size(25, 30);
this.BtnCloseFindFunc.TabIndex = 37;
this.BtnCloseFindFunc.Tag = "Close (Esc)";
this.BtnCloseFindFunc.UseVisualStyleBackColor = true;
this.BtnCloseFindFunc.Click += new System.EventHandler(this.BtnCloseFindFunc_Click);
//
// panelFindFunctionTextBox
//
this.panelFindFunctionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.panelFindFunctionTextBox.Font = new System.Drawing.Font("Segoe UI", 13.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.panelFindFunctionTextBox.Location = new System.Drawing.Point(10, 6);
this.panelFindFunctionTextBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panelFindFunctionTextBox.Name = "panelFindFunctionTextBox";
this.panelFindFunctionTextBox.Size = new System.Drawing.Size(189, 25);
this.panelFindFunctionTextBox.TabIndex = 34;
this.panelFindFunctionTextBox.TextChanged += new System.EventHandler(this.panelFindFunctionTextBox_TextChanged);
this.panelFindFunctionTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.functionTxtFind_KeyDown);
//
// scintillaFunctionsPanel
//
this.scintillaFunctionsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.scintillaFunctionsPanel.Location = new System.Drawing.Point(3, 3);
this.scintillaFunctionsPanel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.scintillaFunctionsPanel.Name = "scintillaFunctionsPanel";
this.scintillaFunctionsPanel.Size = new System.Drawing.Size(678, 559);
this.scintillaFunctionsPanel.TabIndex = 20;
//
// actionsTabPage
//
this.actionsTabPage.Controls.Add(this.PanelSearchActions);
this.actionsTabPage.Controls.Add(this.scintillaActionsPanel);
this.actionsTabPage.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.actionsTabPage.Location = new System.Drawing.Point(4, 22);
this.actionsTabPage.Name = "actionsTabPage";
this.actionsTabPage.Padding = new System.Windows.Forms.Padding(3);
this.actionsTabPage.Size = new System.Drawing.Size(684, 565);
this.actionsTabPage.TabIndex = 2;
this.actionsTabPage.Text = "Actions";
this.actionsTabPage.UseVisualStyleBackColor = true;
//
// PanelSearchActions
//
this.PanelSearchActions.BackColor = System.Drawing.Color.White;
this.PanelSearchActions.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.PanelSearchActions.Controls.Add(this.BtnNextFindActions);
this.PanelSearchActions.Controls.Add(this.BtnPrevFindActions);
this.PanelSearchActions.Controls.Add(this.BtnCloseFindActions);
this.PanelSearchActions.Controls.Add(this.panelFindActionTextBox);
this.PanelSearchActions.Location = new System.Drawing.Point(386, 3);
this.PanelSearchActions.Name = "PanelSearchActions";
this.PanelSearchActions.Size = new System.Drawing.Size(292, 40);
this.PanelSearchActions.TabIndex = 16;
this.PanelSearchActions.Visible = false;
//
// BtnNextFindActions
//
this.BtnNextFindActions.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnNextFindActions.ForeColor = System.Drawing.Color.White;
this.BtnNextFindActions.Image = global::DSPRE.Properties.Resources.arrowdown;
this.BtnNextFindActions.Location = new System.Drawing.Point(233, 4);
this.BtnNextFindActions.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnNextFindActions.Name = "BtnNextFindActions";
this.BtnNextFindActions.Size = new System.Drawing.Size(25, 30);
this.BtnNextFindActions.TabIndex = 40;
this.BtnNextFindActions.Tag = "Find next (Enter)";
this.BtnNextFindActions.UseVisualStyleBackColor = true;
this.BtnNextFindActions.Click += new System.EventHandler(this.BtnNextFindActions_Click);
//
// BtnPrevFindActions
//
this.BtnPrevFindActions.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnPrevFindActions.ForeColor = System.Drawing.Color.White;
this.BtnPrevFindActions.Image = global::DSPRE.Properties.Resources.arrowup;
this.BtnPrevFindActions.Location = new System.Drawing.Point(205, 4);
this.BtnPrevFindActions.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnPrevFindActions.Name = "BtnPrevFindActions";
this.BtnPrevFindActions.Size = new System.Drawing.Size(25, 30);
this.BtnPrevFindActions.TabIndex = 39;
this.BtnPrevFindActions.Tag = "Find previous (Shift+Enter)";
this.BtnPrevFindActions.UseVisualStyleBackColor = true;
this.BtnPrevFindActions.Click += new System.EventHandler(this.BtnPrevFindActions_Click);
//
// BtnCloseFindActions
//
this.BtnCloseFindActions.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.BtnCloseFindActions.ForeColor = System.Drawing.Color.White;
this.BtnCloseFindActions.Image = global::DSPRE.Properties.Resources.Cross;
this.BtnCloseFindActions.Location = new System.Drawing.Point(261, 4);
this.BtnCloseFindActions.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.BtnCloseFindActions.Name = "BtnCloseFindActions";
this.BtnCloseFindActions.Size = new System.Drawing.Size(25, 30);
this.BtnCloseFindActions.TabIndex = 41;
this.BtnCloseFindActions.Tag = "Close (Esc)";
this.BtnCloseFindActions.UseVisualStyleBackColor = true;
this.BtnCloseFindActions.Click += new System.EventHandler(this.BtnCloseFindActions_Click);
//
// panelFindActionTextBox
//
this.panelFindActionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.panelFindActionTextBox.Font = new System.Drawing.Font("Segoe UI", 13.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.panelFindActionTextBox.Location = new System.Drawing.Point(10, 6);
this.panelFindActionTextBox.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panelFindActionTextBox.Name = "panelFindActionTextBox";
this.panelFindActionTextBox.Size = new System.Drawing.Size(189, 25);
this.panelFindActionTextBox.TabIndex = 38;
this.panelFindActionTextBox.TextChanged += new System.EventHandler(this.panelFindActionTextBox_TextChanged);
this.panelFindActionTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.actionTxtFind_KeyDown);
//
// scintillaActionsPanel
//
this.scintillaActionsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.scintillaActionsPanel.Location = new System.Drawing.Point(3, 3);
this.scintillaActionsPanel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.scintillaActionsPanel.Name = "scintillaActionsPanel";
this.scintillaActionsPanel.Size = new System.Drawing.Size(678, 559);
this.scintillaActionsPanel.TabIndex = 21;
//
// addScriptFileButton
//
this.addScriptFileButton.Image = global::DSPRE.Properties.Resources.addIcon;
this.addScriptFileButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.addScriptFileButton.Location = new System.Drawing.Point(369, 667);
this.addScriptFileButton.Name = "addScriptFileButton";
this.addScriptFileButton.Size = new System.Drawing.Size(106, 25);
this.addScriptFileButton.TabIndex = 4;
this.addScriptFileButton.Text = "Add Script File";
this.addScriptFileButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.addScriptFileButton.UseVisualStyleBackColor = true;
this.addScriptFileButton.Click += new System.EventHandler(this.addScriptFileButton_Click);
//
// removeScriptFileButton
//
this.removeScriptFileButton.Image = global::DSPRE.Properties.Resources.deleteIcon;
this.removeScriptFileButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.removeScriptFileButton.Location = new System.Drawing.Point(369, 694);
this.removeScriptFileButton.Name = "removeScriptFileButton";
this.removeScriptFileButton.Size = new System.Drawing.Size(106, 25);
this.removeScriptFileButton.TabIndex = 5;
this.removeScriptFileButton.Text = "Remove Last";
this.removeScriptFileButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.removeScriptFileButton.UseVisualStyleBackColor = true;
this.removeScriptFileButton.Click += new System.EventHandler(this.removeScriptFileButton_Click);
//
// saveScriptFileButton
//
this.saveScriptFileButton.Image = global::DSPRE.Properties.Resources.saveButton;
this.saveScriptFileButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.saveScriptFileButton.Location = new System.Drawing.Point(6, 50);
this.saveScriptFileButton.Name = "saveScriptFileButton";
this.saveScriptFileButton.Size = new System.Drawing.Size(154, 23);
this.saveScriptFileButton.TabIndex = 1;
this.saveScriptFileButton.Text = "&Save Current File";
this.saveScriptFileButton.UseVisualStyleBackColor = true;
this.saveScriptFileButton.Click += new System.EventHandler(this.saveScriptFileButton_Click);
//
// exportScriptFileButton
//
this.exportScriptFileButton.Image = global::DSPRE.Properties.Resources.exportArrow;
this.exportScriptFileButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.exportScriptFileButton.Location = new System.Drawing.Point(294, 667);
this.exportScriptFileButton.Name = "exportScriptFileButton";
this.exportScriptFileButton.Size = new System.Drawing.Size(70, 52);
this.exportScriptFileButton.TabIndex = 3;
this.exportScriptFileButton.Text = "&Export \r\nFile";
this.exportScriptFileButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.exportScriptFileButton.UseVisualStyleBackColor = true;
this.exportScriptFileButton.Click += new System.EventHandler(this.exportScriptFileButton_Click);
//
// importScriptFileButton
//
this.importScriptFileButton.Image = global::DSPRE.Properties.Resources.importArrow;
this.importScriptFileButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.importScriptFileButton.Location = new System.Drawing.Point(219, 667);
this.importScriptFileButton.Name = "importScriptFileButton";
this.importScriptFileButton.Size = new System.Drawing.Size(70, 52);
this.importScriptFileButton.TabIndex = 2;
this.importScriptFileButton.Text = "&Import\r\nFile";
this.importScriptFileButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.importScriptFileButton.UseVisualStyleBackColor = true;
this.importScriptFileButton.Click += new System.EventHandler(this.importScriptFileButton_Click);
//
// groupBox8
//
this.groupBox8.Controls.Add(this.searchInScriptsButton);
this.groupBox8.Controls.Add(this.searchOnlyCurrentScriptCheckBox);
this.groupBox8.Controls.Add(this.scrollToBlockStartcheckBox);
this.groupBox8.Controls.Add(this.scriptSearchCaseSensitiveCheckBox);
this.groupBox8.Controls.Add(this.searchInScriptsTextBox);
this.groupBox8.Controls.Add(this.label31);
this.groupBox8.Controls.Add(this.searchProgressBar);
this.groupBox8.Controls.Add(this.label30);
this.groupBox8.Controls.Add(this.label29);
this.groupBox8.Controls.Add(this.searchInScriptsResultListBox);
this.groupBox8.Location = new System.Drawing.Point(2, 315);
this.groupBox8.Name = "groupBox8";
this.groupBox8.Size = new System.Drawing.Size(472, 298);
this.groupBox8.TabIndex = 18;
this.groupBox8.TabStop = false;
this.groupBox8.Text = "Search for commands:";
//
// searchInScriptsButton
//
this.searchInScriptsButton.Image = global::DSPRE.Properties.Resources.SearchMiniIcon;
this.searchInScriptsButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.searchInScriptsButton.Location = new System.Drawing.Point(272, 27);
this.searchInScriptsButton.Name = "searchInScriptsButton";
this.searchInScriptsButton.Size = new System.Drawing.Size(69, 36);
this.searchInScriptsButton.TabIndex = 13;
this.searchInScriptsButton.Text = "Search";
this.searchInScriptsButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.searchInScriptsButton.UseVisualStyleBackColor = true;
this.searchInScriptsButton.Click += new System.EventHandler(this.searchInScriptsButton_Click);
//
// searchOnlyCurrentScriptCheckBox
//
this.searchOnlyCurrentScriptCheckBox.AutoSize = true;
this.searchOnlyCurrentScriptCheckBox.Location = new System.Drawing.Point(347, 15);
this.searchOnlyCurrentScriptCheckBox.Name = "searchOnlyCurrentScriptCheckBox";
this.searchOnlyCurrentScriptCheckBox.Size = new System.Drawing.Size(84, 17);
this.searchOnlyCurrentScriptCheckBox.TabIndex = 14;
this.searchOnlyCurrentScriptCheckBox.Text = "Only Current";
this.searchOnlyCurrentScriptCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.searchOnlyCurrentScriptCheckBox.UseVisualStyleBackColor = true;
//
// scrollToBlockStartcheckBox
//
this.scrollToBlockStartcheckBox.AutoSize = true;
this.scrollToBlockStartcheckBox.Location = new System.Drawing.Point(347, 61);
this.scrollToBlockStartcheckBox.Name = "scrollToBlockStartcheckBox";
this.scrollToBlockStartcheckBox.Size = new System.Drawing.Size(116, 17);
this.scrollToBlockStartcheckBox.TabIndex = 16;
this.scrollToBlockStartcheckBox.Text = "Scroll to block start";
this.scrollToBlockStartcheckBox.UseVisualStyleBackColor = true;
//
// scriptSearchCaseSensitiveCheckBox
//
this.scriptSearchCaseSensitiveCheckBox.AutoSize = true;
this.scriptSearchCaseSensitiveCheckBox.Location = new System.Drawing.Point(347, 38);
this.scriptSearchCaseSensitiveCheckBox.Name = "scriptSearchCaseSensitiveCheckBox";
this.scriptSearchCaseSensitiveCheckBox.Size = new System.Drawing.Size(83, 17);
this.scriptSearchCaseSensitiveCheckBox.TabIndex = 15;
this.scriptSearchCaseSensitiveCheckBox.Text = "Match Case";
this.scriptSearchCaseSensitiveCheckBox.UseVisualStyleBackColor = true;
//
// searchInScriptsTextBox
//
this.searchInScriptsTextBox.Location = new System.Drawing.Point(11, 36);
this.searchInScriptsTextBox.Name = "searchInScriptsTextBox";
this.searchInScriptsTextBox.Size = new System.Drawing.Size(255, 20);
this.searchInScriptsTextBox.TabIndex = 12;
this.searchInScriptsTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.searchInScriptsTextBox_KeyDown);
//
// label31
//
this.label31.AutoSize = true;
this.label31.Location = new System.Drawing.Point(11, 261);
this.label31.Name = "label31";
this.label31.Size = new System.Drawing.Size(48, 13);
this.label31.TabIndex = 37;
this.label31.Text = "Progress";
//
// searchProgressBar
//
this.searchProgressBar.Location = new System.Drawing.Point(11, 277);
this.searchProgressBar.Name = "searchProgressBar";
this.searchProgressBar.Size = new System.Drawing.Size(452, 14);
this.searchProgressBar.TabIndex = 36;
//
// label30
//
this.label30.AutoSize = true;
this.label30.Location = new System.Drawing.Point(11, 68);
this.label30.Name = "label30";
this.label30.Size = new System.Drawing.Size(42, 13);
this.label30.TabIndex = 35;
this.label30.Text = "Results";
//
// label29
//
this.label29.AutoSize = true;
this.label29.Location = new System.Drawing.Point(11, 20);
this.label29.Name = "label29";
this.label29.Size = new System.Drawing.Size(77, 13);
this.label29.TabIndex = 33;
this.label29.Text = "Line to search:";
//
// searchInScriptsResultListBox
//
this.searchInScriptsResultListBox.Location = new System.Drawing.Point(11, 84);
this.searchInScriptsResultListBox.Name = "searchInScriptsResultListBox";
this.searchInScriptsResultListBox.Size = new System.Drawing.Size(452, 173);
this.searchInScriptsResultListBox.TabIndex = 17;
this.searchInScriptsResultListBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.searchInScriptsResultListBox_KeyDown);
this.searchInScriptsResultListBox.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.searchInScripts_GoToEntryResult);
//
// groupBox24
//
this.groupBox24.Controls.Add(this.ScriptNavigatorTabControl);
this.groupBox24.Location = new System.Drawing.Point(3, 75);
this.groupBox24.Name = "groupBox24";
this.groupBox24.Size = new System.Drawing.Size(472, 234);
this.groupBox24.TabIndex = 42;
this.groupBox24.TabStop = false;
this.groupBox24.Text = "Navigator";
//
// ScriptNavigatorTabControl
//
this.ScriptNavigatorTabControl.Controls.Add(this.ScriptsNavTab);
this.ScriptNavigatorTabControl.Controls.Add(this.FunctionsNavTab);
this.ScriptNavigatorTabControl.Controls.Add(this.ActionsNavTab);
this.ScriptNavigatorTabControl.Location = new System.Drawing.Point(6, 16);
this.ScriptNavigatorTabControl.Name = "ScriptNavigatorTabControl";
this.ScriptNavigatorTabControl.SelectedIndex = 0;
this.ScriptNavigatorTabControl.Size = new System.Drawing.Size(456, 209);
this.ScriptNavigatorTabControl.TabIndex = 8;
//
// ScriptsNavTab
//
this.ScriptsNavTab.Controls.Add(this.scriptsNavListbox);
this.ScriptsNavTab.Location = new System.Drawing.Point(4, 22);
this.ScriptsNavTab.Name = "ScriptsNavTab";
this.ScriptsNavTab.Padding = new System.Windows.Forms.Padding(3);
this.ScriptsNavTab.Size = new System.Drawing.Size(448, 183);
this.ScriptsNavTab.TabIndex = 0;
this.ScriptsNavTab.Text = "Scripts";
this.ScriptsNavTab.UseVisualStyleBackColor = true;
//
// scriptsNavListbox
//
this.scriptsNavListbox.Dock = System.Windows.Forms.DockStyle.Fill;
this.scriptsNavListbox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.scriptsNavListbox.ItemHeight = 15;
this.scriptsNavListbox.Location = new System.Drawing.Point(3, 3);
this.scriptsNavListbox.Name = "scriptsNavListbox";
this.scriptsNavListbox.Size = new System.Drawing.Size(442, 177);
this.scriptsNavListbox.TabIndex = 9;
this.scriptsNavListbox.SelectedIndexChanged += new System.EventHandler(this.scriptsNavListbox_SelectedIndexChanged);
//
// FunctionsNavTab
//
this.FunctionsNavTab.Controls.Add(this.functionsNavListbox);
this.FunctionsNavTab.Location = new System.Drawing.Point(4, 22);
this.FunctionsNavTab.Name = "FunctionsNavTab";
this.FunctionsNavTab.Padding = new System.Windows.Forms.Padding(3);
this.FunctionsNavTab.Size = new System.Drawing.Size(448, 183);
this.FunctionsNavTab.TabIndex = 1;
this.FunctionsNavTab.Text = "Functions";
this.FunctionsNavTab.UseVisualStyleBackColor = true;
//
// functionsNavListbox
//
this.functionsNavListbox.Dock = System.Windows.Forms.DockStyle.Fill;
this.functionsNavListbox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.functionsNavListbox.ItemHeight = 15;
this.functionsNavListbox.Location = new System.Drawing.Point(3, 3);
this.functionsNavListbox.Name = "functionsNavListbox";
this.functionsNavListbox.Size = new System.Drawing.Size(442, 177);
this.functionsNavListbox.TabIndex = 10;
this.functionsNavListbox.SelectedIndexChanged += new System.EventHandler(this.functionsNavListbox_SelectedIndexChanged);
//
// ActionsNavTab
//
this.ActionsNavTab.Controls.Add(this.actionsNavListbox);
this.ActionsNavTab.Location = new System.Drawing.Point(4, 22);
this.ActionsNavTab.Name = "ActionsNavTab";
this.ActionsNavTab.Padding = new System.Windows.Forms.Padding(3);
this.ActionsNavTab.Size = new System.Drawing.Size(448, 183);
this.ActionsNavTab.TabIndex = 2;
this.ActionsNavTab.Text = "Actions";
this.ActionsNavTab.UseVisualStyleBackColor = true;
//
// actionsNavListbox
//
this.actionsNavListbox.Dock = System.Windows.Forms.DockStyle.Fill;
this.actionsNavListbox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.actionsNavListbox.ItemHeight = 15;
this.actionsNavListbox.Location = new System.Drawing.Point(3, 3);
this.actionsNavListbox.Name = "actionsNavListbox";
this.actionsNavListbox.Size = new System.Drawing.Size(442, 177);
this.actionsNavListbox.TabIndex = 11;
this.actionsNavListbox.SelectedIndexChanged += new System.EventHandler(this.actionsNavListbox_SelectedIndexChanged);
//
// openFindScriptEditorButton
//
this.openFindScriptEditorButton.Image = global::DSPRE.Properties.Resources.SearchMiniIcon;
this.openFindScriptEditorButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.openFindScriptEditorButton.Location = new System.Drawing.Point(1079, 11);
this.openFindScriptEditorButton.Name = "openFindScriptEditorButton";
this.openFindScriptEditorButton.Size = new System.Drawing.Size(24, 24);
this.openFindScriptEditorButton.TabIndex = 27;
this.openFindScriptEditorButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.openFindScriptEditorButton.UseVisualStyleBackColor = true;
this.openFindScriptEditorButton.Click += new System.EventHandler(this.openFindScriptEditorButton_Click);
//
// expandScriptTextButton
//
this.expandScriptTextButton.Image = global::DSPRE.Properties.Resources.expandArrow;
this.expandScriptTextButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.expandScriptTextButton.Location = new System.Drawing.Point(1107, 11);
this.expandScriptTextButton.Name = "expandScriptTextButton";
this.expandScriptTextButton.Size = new System.Drawing.Size(24, 24);
this.expandScriptTextButton.TabIndex = 28;
this.expandScriptTextButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.expandScriptTextButton.UseVisualStyleBackColor = true;
this.expandScriptTextButton.Click += new System.EventHandler(this.ScriptEditorExpandButton_Click);
//
// compressScriptTextButton
//
this.compressScriptTextButton.Image = global::DSPRE.Properties.Resources.compressArrow;
this.compressScriptTextButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.compressScriptTextButton.Location = new System.Drawing.Point(1135, 11);
this.compressScriptTextButton.Name = "compressScriptTextButton";
this.compressScriptTextButton.Size = new System.Drawing.Size(24, 24);
this.compressScriptTextButton.TabIndex = 29;
this.compressScriptTextButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.compressScriptTextButton.UseVisualStyleBackColor = true;
this.compressScriptTextButton.Click += new System.EventHandler(this.ScriptEditorCollapseButton_Click);
//
// scriptEditorWordWrapCheckbox
//
this.scriptEditorWordWrapCheckbox.Appearance = System.Windows.Forms.Appearance.Button;
this.scriptEditorWordWrapCheckbox.AutoSize = true;
this.scriptEditorWordWrapCheckbox.Checked = true;
this.scriptEditorWordWrapCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.scriptEditorWordWrapCheckbox.Location = new System.Drawing.Point(907, 12);
this.scriptEditorWordWrapCheckbox.Name = "scriptEditorWordWrapCheckbox";
this.scriptEditorWordWrapCheckbox.Size = new System.Drawing.Size(72, 23);
this.scriptEditorWordWrapCheckbox.TabIndex = 25;
this.scriptEditorWordWrapCheckbox.Text = "Word Wrap";
this.scriptEditorWordWrapCheckbox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.scriptEditorWordWrapCheckbox.UseVisualStyleBackColor = true;
this.scriptEditorWordWrapCheckbox.CheckedChanged += new System.EventHandler(this.scriptEditorWordWrapCheckbox_CheckedChanged);
//
// scriptEditorWhitespacesCheckbox
//
this.scriptEditorWhitespacesCheckbox.Appearance = System.Windows.Forms.Appearance.Button;
this.scriptEditorWhitespacesCheckbox.AutoSize = true;
this.scriptEditorWhitespacesCheckbox.Location = new System.Drawing.Point(981, 12);
this.scriptEditorWhitespacesCheckbox.Name = "scriptEditorWhitespacesCheckbox";
this.scriptEditorWhitespacesCheckbox.Size = new System.Drawing.Size(79, 23);
this.scriptEditorWhitespacesCheckbox.TabIndex = 26;
this.scriptEditorWhitespacesCheckbox.Text = "Whitespaces";
this.scriptEditorWhitespacesCheckbox.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.scriptEditorWhitespacesCheckbox.UseVisualStyleBackColor = true;
this.scriptEditorWhitespacesCheckbox.CheckedChanged += new System.EventHandler(this.viewWhiteSpacesButton_Click);
//
// groupBox26
//
this.groupBox26.Controls.Add(this.scriptEditorNumberFormatNoPreference);
this.groupBox26.Controls.Add(this.scriptEditorNumberFormatDecimal);
this.groupBox26.Controls.Add(this.scriptEditorNumberFormatHex);
this.groupBox26.Location = new System.Drawing.Point(700, 4);
this.groupBox26.Name = "groupBox26";
this.groupBox26.Size = new System.Drawing.Size(190, 36);
this.groupBox26.TabIndex = 50;
this.groupBox26.TabStop = false;
this.groupBox26.Text = "Number Format Preference";
//
// scriptEditorNumberFormatNoPreference
//
this.scriptEditorNumberFormatNoPreference.AutoSize = true;
this.scriptEditorNumberFormatNoPreference.Checked = true;
this.scriptEditorNumberFormatNoPreference.Location = new System.Drawing.Point(11, 14);
this.scriptEditorNumberFormatNoPreference.Name = "scriptEditorNumberFormatNoPreference";
this.scriptEditorNumberFormatNoPreference.Size = new System.Drawing.Size(47, 17);
this.scriptEditorNumberFormatNoPreference.TabIndex = 22;
this.scriptEditorNumberFormatNoPreference.TabStop = true;
this.scriptEditorNumberFormatNoPreference.Text = "Auto";
this.scriptEditorNumberFormatNoPreference.UseVisualStyleBackColor = true;
this.scriptEditorNumberFormatNoPreference.CheckedChanged += new System.EventHandler(this.UpdateScriptNumberFormatNoPref);
//
// scriptEditorNumberFormatDecimal
//
this.scriptEditorNumberFormatDecimal.AutoSize = true;
this.scriptEditorNumberFormatDecimal.Location = new System.Drawing.Point(121, 14);
this.scriptEditorNumberFormatDecimal.Name = "scriptEditorNumberFormatDecimal";
this.scriptEditorNumberFormatDecimal.Size = new System.Drawing.Size(63, 17);
this.scriptEditorNumberFormatDecimal.TabIndex = 24;
this.scriptEditorNumberFormatDecimal.Text = "Decimal";
this.scriptEditorNumberFormatDecimal.UseVisualStyleBackColor = true;
this.scriptEditorNumberFormatDecimal.CheckedChanged += new System.EventHandler(this.UpdateScriptNumberFormatDec);
//
// scriptEditorNumberFormatHex
//
this.scriptEditorNumberFormatHex.AutoSize = true;
this.scriptEditorNumberFormatHex.Location = new System.Drawing.Point(68, 14);
this.scriptEditorNumberFormatHex.Name = "scriptEditorNumberFormatHex";
this.scriptEditorNumberFormatHex.Size = new System.Drawing.Size(44, 17);
this.scriptEditorNumberFormatHex.TabIndex = 23;
this.scriptEditorNumberFormatHex.Text = "Hex";
this.scriptEditorNumberFormatHex.UseVisualStyleBackColor = true;
this.scriptEditorNumberFormatHex.CheckedChanged += new System.EventHandler(this.UpdateScriptNumberFormatHex);
//
// viewLevelScriptButton
//
this.viewLevelScriptButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.viewLevelScriptButton.Location = new System.Drawing.Point(481, 681);
this.viewLevelScriptButton.Name = "viewLevelScriptButton";
this.viewLevelScriptButton.Size = new System.Drawing.Size(91, 25);
this.viewLevelScriptButton.TabIndex = 6;
this.viewLevelScriptButton.Text = "View level script";
this.viewLevelScriptButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.viewLevelScriptButton.UseVisualStyleBackColor = true;
this.viewLevelScriptButton.Click += new System.EventHandler(this.viewLevelScriptButton_Click);
//
// locateCurrentScriptFile
//
this.locateCurrentScriptFile.Image = global::DSPRE.Properties.Resources.open_file;
this.locateCurrentScriptFile.Location = new System.Drawing.Point(423, 29);
this.locateCurrentScriptFile.Name = "locateCurrentScriptFile";
this.locateCurrentScriptFile.Size = new System.Drawing.Size(42, 40);
this.locateCurrentScriptFile.TabIndex = 7;
this.locateCurrentScriptFile.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.locateCurrentScriptFile.UseVisualStyleBackColor = true;
this.locateCurrentScriptFile.Click += new System.EventHandler(this.locateCurrentScriptFile_Click);
//
// ScriptEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.locateCurrentScriptFile);
this.Controls.Add(this.groupBox24);
this.Controls.Add(this.viewLevelScriptButton);
this.Controls.Add(this.selectScriptFileComboBox);
this.Controls.Add(this.groupBox26);
this.Controls.Add(this.label5);
this.Controls.Add(this.scriptEditorWhitespacesCheckbox);
this.Controls.Add(this.scriptEditorWordWrapCheckbox);
this.Controls.Add(this.addScriptFileButton);
this.Controls.Add(this.compressScriptTextButton);
this.Controls.Add(this.removeScriptFileButton);
this.Controls.Add(this.expandScriptTextButton);
this.Controls.Add(this.saveScriptFileButton);
this.Controls.Add(this.openFindScriptEditorButton);
this.Controls.Add(this.exportScriptFileButton);
this.Controls.Add(this.importScriptFileButton);
this.Controls.Add(this.groupBox8);
this.Controls.Add(this.scriptEditorTabControl);
this.Name = "ScriptEditor";
this.Size = new System.Drawing.Size(1177, 735);
this.scriptEditorTabControl.ResumeLayout(false);
this.scriptsTabPage.ResumeLayout(false);
this.PanelSearchScripts.ResumeLayout(false);
this.PanelSearchScripts.PerformLayout();
this.functionsTabPage.ResumeLayout(false);
this.PanelSearchFunctions.ResumeLayout(false);
this.PanelSearchFunctions.PerformLayout();
this.actionsTabPage.ResumeLayout(false);
this.PanelSearchActions.ResumeLayout(false);
this.PanelSearchActions.PerformLayout();
this.groupBox8.ResumeLayout(false);
this.groupBox8.PerformLayout();
this.groupBox24.ResumeLayout(false);
this.ScriptNavigatorTabControl.ResumeLayout(false);
this.ScriptsNavTab.ResumeLayout(false);
this.FunctionsNavTab.ResumeLayout(false);
this.ActionsNavTab.ResumeLayout(false);
this.groupBox26.ResumeLayout(false);
this.groupBox26.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.CheckBox scrollToBlockStartcheckBox;
#endregion
public System.Windows.Forms.ComboBox selectScriptFileComboBox;
private System.Windows.Forms.Label label5;
public System.Windows.Forms.TabControl scriptEditorTabControl;
private System.Windows.Forms.TabPage scriptsTabPage;
private System.Windows.Forms.Panel PanelSearchScripts;
private System.Windows.Forms.Button BtnNextFindScript;
private System.Windows.Forms.Button BtnPrevFindScript;
private System.Windows.Forms.Button BtnCloseFindScript;
private System.Windows.Forms.TextBox panelFindScriptTextBox;
private System.Windows.Forms.Panel scintillaScriptsPanel;
private System.Windows.Forms.TabPage functionsTabPage;
private System.Windows.Forms.Panel PanelSearchFunctions;
private System.Windows.Forms.Button BtnNextFindFunc;
private System.Windows.Forms.Button BtnPrevFindFunc;
private System.Windows.Forms.Button BtnCloseFindFunc;
private System.Windows.Forms.TextBox panelFindFunctionTextBox;
private System.Windows.Forms.Panel scintillaFunctionsPanel;
private System.Windows.Forms.TabPage actionsTabPage;
private System.Windows.Forms.Panel PanelSearchActions;
private System.Windows.Forms.Button BtnNextFindActions;
private System.Windows.Forms.Button BtnPrevFindActions;
private System.Windows.Forms.Button BtnCloseFindActions;
private System.Windows.Forms.TextBox panelFindActionTextBox;
private System.Windows.Forms.Panel scintillaActionsPanel;
private System.Windows.Forms.Button addScriptFileButton;
private System.Windows.Forms.Button removeScriptFileButton;
private System.Windows.Forms.Button saveScriptFileButton;
private System.Windows.Forms.Button exportScriptFileButton;
private System.Windows.Forms.Button importScriptFileButton;
private System.Windows.Forms.GroupBox groupBox8;
private System.Windows.Forms.CheckBox searchOnlyCurrentScriptCheckBox;
private System.Windows.Forms.CheckBox scriptSearchCaseSensitiveCheckBox;
private System.Windows.Forms.TextBox searchInScriptsTextBox;
private System.Windows.Forms.Label label31;
private System.Windows.Forms.ProgressBar searchProgressBar;
private System.Windows.Forms.Label label30;
private System.Windows.Forms.Label label29;
private System.Windows.Forms.Button searchInScriptsButton;
private System.Windows.Forms.ListBox searchInScriptsResultListBox;
private System.Windows.Forms.GroupBox groupBox24;
private System.Windows.Forms.TabControl ScriptNavigatorTabControl;
private System.Windows.Forms.TabPage ScriptsNavTab;
private System.Windows.Forms.ListBox scriptsNavListbox;
private System.Windows.Forms.TabPage FunctionsNavTab;
private System.Windows.Forms.ListBox functionsNavListbox;
private System.Windows.Forms.TabPage ActionsNavTab;
private System.Windows.Forms.ListBox actionsNavListbox;
private System.Windows.Forms.Button openFindScriptEditorButton;
private System.Windows.Forms.Button expandScriptTextButton;
private System.Windows.Forms.Button compressScriptTextButton;
private System.Windows.Forms.CheckBox scriptEditorWordWrapCheckbox;
private System.Windows.Forms.CheckBox scriptEditorWhitespacesCheckbox;
private System.Windows.Forms.GroupBox groupBox26;
private System.Windows.Forms.RadioButton scriptEditorNumberFormatNoPreference;
private System.Windows.Forms.RadioButton scriptEditorNumberFormatDecimal;
private System.Windows.Forms.RadioButton scriptEditorNumberFormatHex;
private System.Windows.Forms.Button viewLevelScriptButton;
private System.Windows.Forms.Button locateCurrentScriptFile;
}
}
================================================
FILE: DS_Map/Editors/ScriptEditor.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using DSPRE.Resources;
using DSPRE.ROMFiles;
using ScintillaNET;
using ScintillaNET.Utils;
using System.Globalization;
namespace DSPRE.Editors {
public partial class ScriptEditor : UserControl {
public bool scriptEditorIsReady { get; set; } = false;
private Scintilla ScriptTextArea;
private Scintilla FunctionTextArea;
private Scintilla ActionTextArea;
private SearchManager scriptSearchManager;
private SearchManager functionSearchManager;
private SearchManager actionSearchManager;
private Scintilla currentScintillaEditor;
private SearchManager currentSearchManager;
private bool scriptsDirty = false;
private bool functionsDirty = false;
private bool actionsDirty = false;
private string cmdKeyWords = "";
private string secondaryKeyWords = "";
private ScriptFile currentScriptFile;
MainProgram _parent;
///
/// the background color of the text area
///
private readonly Color BACK_COLOR = Color.FromArgb(0x2A211C);
///
/// default text color of the text area
///
private readonly Color FORE_COLOR = Color.FromArgb(0xB7B7B7);
///
/// change this to whatever margin you want the line numbers to show in
///
private const int NUMBER_MARGIN = 1;
///
/// change this to whatever margin you want the bookmarks/breakpoints to show in
///
private const int BOOKMARK_MARGIN = 2;
private const int BOOKMARK_MARKER = 2;
///
/// change this to whatever margin you want the code folding tree (+/-) to show in
///
private const int FOLDING_MARGIN = 3;
///
/// set this true to show circular buttons for code folding (the [+] and [-] buttons on the margin)
///
private const bool CODE_FOLDING_CIRCULAR = true;
readonly Point initial_importScriptFileButton_location;
readonly Point initial_exportScriptFileButton_location;
readonly Point initial_addScriptFileButton_location;
readonly Point initial_removeScriptFileButton_location;
readonly Point initial_viewLevelScript_location;
readonly Point new_importScriptFileButton_location;
readonly Point new_exportScriptFileButton_location;
readonly Point new_addScriptFileButton_location;
readonly Point new_removeScriptFileButton_location;
readonly Point new_viewLevelScript_location;
public ScriptEditor() {
InitializeComponent();
//initially, these buttons are off the canvas so they can be interacted with in the designer
//they are then moved as needed
initial_importScriptFileButton_location = importScriptFileButton.Location;
initial_exportScriptFileButton_location = exportScriptFileButton.Location;
initial_addScriptFileButton_location = addScriptFileButton.Location;
initial_removeScriptFileButton_location = removeScriptFileButton.Location;
initial_viewLevelScript_location = viewLevelScriptButton.Location;
new_importScriptFileButton_location = new Point(164, 22);
new_exportScriptFileButton_location = new Point(239, 22);
new_addScriptFileButton_location = new Point(314, 22);
new_removeScriptFileButton_location = new Point(314, 49);
new_viewLevelScript_location = new Point(326, 37);
importScriptFileButton.Enabled = false;
exportScriptFileButton.Enabled = false;
addScriptFileButton.Enabled = false;
removeScriptFileButton.Enabled = false;
viewLevelScriptButton.Enabled = false;
}
public void SetupScriptEditor(MainProgram parent, bool force = false) {
if (scriptEditorIsReady && !force) {
return;
}
scriptEditorIsReady = true;
/* Extract essential NARCs sub-archives*/
Helpers.statusLabelMessage("Setting up Script Editor...");
this._parent = parent;
SetupScriptEditorTextAreas();
Update();
DSUtils.TryUnpackNarcs(new List { RomInfo.DirNames.scripts }); //12 = scripts Narc Dir
populate_selectScriptFileComboBox(0);
UpdateScriptNumberCheckBox((NumberStyles)Properties.Settings.Default.scriptEditorFormatPreference);
Helpers.statusLabelMessage();
}
public void OpenScriptEditor(MainProgram parent, int scriptFileID) {
SetupScriptEditor(parent);
scriptEditorTabControl.SelectedIndex = 0;
selectScriptFileComboBox.SelectedIndex = scriptFileID;
EditorPanels.mainTabControl.SelectedTab = EditorPanels.scriptEditorTabPage;
}
private void SetupScriptEditorTextAreas() {
//PREPARE SCRIPT EDITOR KEYWORDS
cmdKeyWords = String.Join(" ", RomInfo.ScriptCommandNamesDict.Values) +
" " + String.Join(" ", ScriptDatabase.movementsDictIDName.Values);
cmdKeyWords += " " + cmdKeyWords.ToUpper() + " " + cmdKeyWords.ToLower();
secondaryKeyWords = String.Join(" ", RomInfo.ScriptComparisonOperatorsDict.Values) +
" " + String.Join(" ", ScriptDatabase.specialOverworlds.Values) +
" " + String.Join(" ", ScriptDatabase.overworldDirections.Values) +
" " + ScriptFile.ContainerTypes.Script.ToString() +
" " + ScriptFile.ContainerTypes.Function.ToString() +
" " + ScriptFile.ContainerTypes.Action.ToString() +
" " + Event.EventType.Overworld +
" " + Overworld.MovementCodeKW;
secondaryKeyWords += " " + secondaryKeyWords.ToUpper() + " " + secondaryKeyWords.ToLower();
// CREATE CONTROLS
ScriptTextArea = new Scintilla();
scriptSearchManager = new SearchManager(EditorPanels.MainProgram, ScriptTextArea, panelFindScriptTextBox, PanelSearchScripts);
scintillaScriptsPanel.Controls.Clear();
scintillaScriptsPanel.Controls.Add(ScriptTextArea);
FunctionTextArea = new Scintilla();
functionSearchManager = new SearchManager(EditorPanels.MainProgram, FunctionTextArea, panelFindFunctionTextBox, PanelSearchFunctions);
scintillaFunctionsPanel.Controls.Clear();
scintillaFunctionsPanel.Controls.Add(FunctionTextArea);
ActionTextArea = new Scintilla();
actionSearchManager = new SearchManager(EditorPanels.MainProgram, ActionTextArea, panelFindActionTextBox, PanelSearchActions);
scintillaActionsPanel.Controls.Clear();
scintillaActionsPanel.Controls.Add(ActionTextArea);
currentScintillaEditor = ScriptTextArea;
currentSearchManager = scriptSearchManager;
// BASIC CONFIG
ScriptTextArea.TextChanged += (OnTextChangedScript);
FunctionTextArea.TextChanged += (OnTextChangedFunction);
ActionTextArea.TextChanged += (OnTextChangedAction);
// INITIAL VIEW CONFIG
InitialViewConfig(ScriptTextArea);
InitialViewConfig(FunctionTextArea);
InitialViewConfig(ActionTextArea);
InitSyntaxColoring(ScriptTextArea);
InitSyntaxColoring(FunctionTextArea);
InitSyntaxColoring(ActionTextArea);
// NUMBER MARGIN
InitNumberMargin(ScriptTextArea, ScriptTextArea_MarginClick);
InitNumberMargin(FunctionTextArea, FunctionTextArea_MarginClick);
InitNumberMargin(ActionTextArea, ActionTextArea_MarginClick);
// BOOKMARK MARGIN
InitBookmarkMargin(ScriptTextArea);
InitBookmarkMargin(FunctionTextArea);
InitBookmarkMargin(ActionTextArea);
// CODE FOLDING MARGIN
InitCodeFolding(ScriptTextArea);
InitCodeFolding(FunctionTextArea);
InitCodeFolding(ActionTextArea);
// INIT HOTKEYS
InitHotkeys(ScriptTextArea, scriptSearchManager);
InitHotkeys(FunctionTextArea, functionSearchManager);
InitHotkeys(ActionTextArea, actionSearchManager);
// INIT TOOLTIPS DWELLING
/*
ScriptTextArea.MouseDwellTime = 300;
ScriptTextArea.DwellEnd += TextArea_DwellEnd;
ScriptTextArea.DwellStart += TextArea_DwellStart;
FunctionTextArea.MouseDwellTime = 300;
FunctionTextArea.DwellEnd += TextArea_DwellEnd;
FunctionTextArea.DwellStart += TextArea_DwellStart;
*/
}
private void populate_selectScriptFileComboBox(int selectedIndex = 0) {
selectScriptFileComboBox.Items.Clear();
int scriptCount = Filesystem.GetScriptCount();
for (int i = 0; i < scriptCount; i++) {
// ScriptFile currentScriptFile = new ScriptFile(i, true, true);
// selectScriptFileComboBox.Items.Add(currentScriptFile);
selectScriptFileComboBox.Items.Add($"Script File {i}");
}
selectScriptFileComboBox.SelectedIndex = selectedIndex;
}
private void InitialViewConfig(Scintilla textArea) {
textArea.Dock = DockStyle.Fill;
textArea.WrapMode = WrapMode.Word;
textArea.IndentationGuides = IndentView.LookBoth;
textArea.CaretPeriod = 500;
textArea.CaretForeColor = Color.White;
textArea.SetSelectionBackColor(true, Color.FromArgb(0x114D9C));
textArea.WrapIndentMode = WrapIndentMode.Same;
}
private void InitSyntaxColoring(Scintilla textArea) {
// Configure the default style
textArea.StyleResetDefault();
textArea.Styles[Style.Default].Font = "Consolas";
textArea.Styles[Style.Default].Size = 12;
textArea.Styles[Style.Default].BackColor = Color.FromArgb(0x212121);
textArea.Styles[Style.Default].ForeColor = Color.FromArgb(0xFFFFFF);
textArea.StyleClearAll();
// Configure the lexer styles
textArea.Styles[Style.Python.Identifier].ForeColor = Color.FromArgb(0xD0DAE2);
textArea.Styles[Style.Python.CommentLine].ForeColor = Color.FromArgb(0x40BF57);
textArea.Styles[Style.Python.Number].ForeColor = Color.FromArgb(0xFFFF00);
textArea.Styles[Style.Python.String].ForeColor = Color.FromArgb(0xFF00FF);
textArea.Styles[Style.Python.Character].ForeColor = Color.FromArgb(0xE95454);
textArea.Styles[Style.Python.Operator].ForeColor = Color.FromArgb(0xFFFF00);
textArea.Styles[Style.Python.Word].ForeColor = Color.FromArgb(0x48A8EE);
textArea.Styles[Style.Python.Word2].ForeColor = Color.FromArgb(0xF98906);
textArea.Lexer = Lexer.Python;
textArea.SetKeywords(0, cmdKeyWords);
textArea.SetKeywords(1, secondaryKeyWords);
}
private void InitNumberMargin(Scintilla textArea, EventHandler textArea_MarginClick) {
textArea.Styles[Style.LineNumber].BackColor = BACK_COLOR;
textArea.Styles[Style.LineNumber].ForeColor = FORE_COLOR;
textArea.Styles[Style.IndentGuide].ForeColor = FORE_COLOR;
textArea.Styles[Style.IndentGuide].BackColor = BACK_COLOR;
Margin nums = textArea.Margins[NUMBER_MARGIN];
nums.Type = MarginType.Number;
nums.Sensitive = true;
nums.Mask = 0;
textArea.MarginClick += textArea_MarginClick;
}
private void InitBookmarkMargin(Scintilla textArea) {
//TextArea.SetFoldMarginColor(true, IntToColor(BACK_COLOR));
Margin margin = textArea.Margins[BOOKMARK_MARGIN];
margin.Width = 20;
margin.Sensitive = true;
margin.Type = MarginType.Symbol;
margin.Mask = (1 << BOOKMARK_MARKER);
//margin.Cursor = MarginCursor.Arrow;
Marker marker = textArea.Markers[BOOKMARK_MARKER];
marker.Symbol = MarkerSymbol.Circle;
marker.SetBackColor(Color.FromArgb(0xFF003B));
marker.SetForeColor(Color.FromArgb(0x000000));
marker.SetAlpha(100);
}
private void InitCodeFolding(Scintilla textArea) {
textArea.SetFoldMarginColor(true, BACK_COLOR);
textArea.SetFoldMarginHighlightColor(true, BACK_COLOR);
// Enable code folding
textArea.SetProperty("fold", "1");
textArea.SetProperty("fold.compact", "1");
// Configure a margin to display folding symbols
textArea.Margins[FOLDING_MARGIN].Type = MarginType.Symbol;
textArea.Margins[FOLDING_MARGIN].Mask = Marker.MaskFolders;
textArea.Margins[FOLDING_MARGIN].Sensitive = true;
textArea.Margins[FOLDING_MARGIN].Width = 20;
// Set colors for all folding markers
for (int i = 25; i <= 31; i++) {
textArea.Markers[i].SetForeColor(BACK_COLOR); // styles for [+] and [-]
textArea.Markers[i].SetBackColor(FORE_COLOR); // styles for [+] and [-]
}
// Configure folding markers with respective symbols
textArea.Markers[Marker.Folder].Symbol = CODE_FOLDING_CIRCULAR ? MarkerSymbol.CirclePlus : MarkerSymbol.BoxPlus;
textArea.Markers[Marker.FolderOpen].Symbol = CODE_FOLDING_CIRCULAR ? MarkerSymbol.CircleMinus : MarkerSymbol.BoxMinus;
textArea.Markers[Marker.FolderEnd].Symbol = CODE_FOLDING_CIRCULAR ? MarkerSymbol.CirclePlusConnected : MarkerSymbol.BoxPlusConnected;
textArea.Markers[Marker.FolderMidTail].Symbol = MarkerSymbol.TCorner;
textArea.Markers[Marker.FolderOpenMid].Symbol = CODE_FOLDING_CIRCULAR ? MarkerSymbol.CircleMinusConnected : MarkerSymbol.BoxMinusConnected;
textArea.Markers[Marker.FolderSub].Symbol = MarkerSymbol.VLine;
textArea.Markers[Marker.FolderTail].Symbol = MarkerSymbol.LCorner;
// Enable automatic folding
textArea.AutomaticFold = (AutomaticFold.Show | AutomaticFold.Click | AutomaticFold.Change);
}
private void InitHotkeys(Scintilla scintillaTb, SearchManager sm) {
// register the hotkeys with the form
HotKeyManager.AddHotKey(scintillaTb, sm.OpenSearch, Keys.F, true);
HotKeyManager.AddHotKey(scintillaTb, () => Uppercase(scintillaTb), Keys.U, true);
HotKeyManager.AddHotKey(scintillaTb, () => Lowercase(scintillaTb), Keys.L, true);
HotKeyManager.AddHotKey(scintillaTb, () => ZoomIn(scintillaTb), Keys.Oemplus, true);
HotKeyManager.AddHotKey(scintillaTb, () => ZoomOut(scintillaTb), Keys.OemMinus, true);
HotKeyManager.AddHotKey(scintillaTb, () => ZoomDefault(scintillaTb), Keys.D0, true);
HotKeyManager.AddHotKey(scintillaTb, sm.CloseSearch, Keys.Escape);
// remove conflicting hotkeys from scintilla
scintillaTb.ClearCmdKey(Keys.Control | Keys.F);
scintillaTb.ClearCmdKey(Keys.Control | Keys.R);
scintillaTb.ClearCmdKey(Keys.Control | Keys.H);
scintillaTb.ClearCmdKey(Keys.Control | Keys.L);
scintillaTb.ClearCmdKey(Keys.Control | Keys.U);
}
private void Uppercase(Scintilla textArea) {
// save the selection
int start = textArea.SelectionStart;
int end = textArea.SelectionEnd;
// modify the selected text
textArea.ReplaceSelection(textArea.GetTextRange(start, end - start).ToUpper());
// preserve the original selection
textArea.SetSelection(start, end);
}
private void Lowercase(Scintilla textArea) {
// save the selection
int start = textArea.SelectionStart;
int end = textArea.SelectionEnd;
// modify the selected text
textArea.ReplaceSelection(textArea.GetTextRange(start, end - start).ToLower());
// preserve the original selection
textArea.SetSelection(start, end);
}
private void ZoomIn(Scintilla textArea) {
textArea.ZoomIn();
}
private void ZoomOut(Scintilla textArea) {
textArea.ZoomOut();
}
private void ZoomDefault(Scintilla textArea) {
textArea.Zoom = 0;
}
private void ScriptEditorSetClean() {
Helpers.DisableHandlers();
scriptsTabPage.Text = ScriptFile.ContainerTypes.Script.ToString() + "s";
functionsTabPage.Text = ScriptFile.ContainerTypes.Function.ToString() + "s";
actionsTabPage.Text = ScriptFile.ContainerTypes.Action.ToString() + "s";
scriptsDirty = functionsDirty = actionsDirty = false;
Helpers.EnableHandlers();
}
private void OnTextChangedScript(object sender, EventArgs e) {
ScriptTextArea.Margins[NUMBER_MARGIN].Width = ScriptTextArea.Lines.Count.ToString().Length * 13;
scriptsDirty = true;
scriptsTabPage.Text = ScriptFile.ContainerTypes.Script.ToString() + "s" + "*";
}
private void OnTextChangedFunction(object sender, EventArgs e) {
FunctionTextArea.Margins[NUMBER_MARGIN].Width = FunctionTextArea.Lines.Count.ToString().Length * 13;
functionsDirty = true;
functionsTabPage.Text = ScriptFile.ContainerTypes.Function.ToString() + "s" + "*";
}
private void OnTextChangedAction(object sender, EventArgs e) {
ActionTextArea.Margins[NUMBER_MARGIN].Width = ActionTextArea.Lines.Count.ToString().Length * 13;
actionsDirty = true;
actionsTabPage.Text = ScriptFile.ContainerTypes.Action.ToString() + "s" + "*";
}
private void ScriptTextArea_MarginClick(object sender, MarginClickEventArgs e) {
MarginClick(ScriptTextArea, e);
}
private void FunctionTextArea_MarginClick(object sender, MarginClickEventArgs e) {
MarginClick(FunctionTextArea, e);
}
private void ActionTextArea_MarginClick(object sender, MarginClickEventArgs e) {
MarginClick(ActionTextArea, e);
}
private void MarginClick(Scintilla textArea, MarginClickEventArgs e) {
if (e.Margin == BOOKMARK_MARGIN) {
// Do we have a marker for this line?
const uint mask = (1 << BOOKMARK_MARKER);
Line line = textArea.Lines[textArea.LineFromPosition(e.Position)];
if ((line.MarkerGet() & mask) > 0) {
// Remove existing bookmark
line.MarkerDelete(BOOKMARK_MARKER);
} else {
// Add bookmark
line.MarkerAdd(BOOKMARK_MARKER);
}
}
}
private void selectScriptFileComboBox_SelectedIndexChanged(object sender, EventArgs e) {
DisplayScript();
}
public void UpdateScriptNumberCheckBox(NumberStyles toSet) {
Helpers.DisableHandlers();
Properties.Settings.Default.scriptEditorFormatPreference = (int)toSet;
switch ((NumberStyles)Properties.Settings.Default.scriptEditorFormatPreference) {
case NumberStyles.None:
scriptEditorNumberFormatNoPreference.Checked = true;
break;
case NumberStyles.HexNumber:
scriptEditorNumberFormatHex.Checked = true;
break;
case NumberStyles.Integer:
scriptEditorNumberFormatDecimal.Checked = true;
break;
}
Console.WriteLine("changed style to " + Properties.Settings.Default.scriptEditorFormatPreference);
Helpers.EnableHandlers();
}
private void UpdateScriptNumberFormat(NumberStyles numberStyle) {
if (Helpers.HandlersEnabled) {
NumberStyles old = (NumberStyles)Properties.Settings.Default.scriptEditorFormatPreference; //Local Backup
Properties.Settings.Default.scriptEditorFormatPreference = (int)numberStyle;
if (!DisplayScript()) {
UpdateScriptNumberCheckBox(old); //Restore old checkbox status! Script couldn't be redrawn
}
}
}
private void UpdateScriptNumberFormatNoPref(object sender, EventArgs e) {
UpdateScriptNumberFormat(NumberStyles.None);
}
private void UpdateScriptNumberFormatDec(object sender, EventArgs e) {
UpdateScriptNumberFormat(NumberStyles.Integer);
}
private void UpdateScriptNumberFormatHex(object sender, EventArgs e) {
UpdateScriptNumberFormat(NumberStyles.HexNumber);
}
private bool DisplayScript() {
Console.WriteLine("Script Reload has been requested");
/* clear controls */
if (Helpers.HandlersDisabled || selectScriptFileComboBox.SelectedItem == null) {
return false;
}
if (scriptsDirty || functionsDirty || actionsDirty) {
DialogResult d = MessageBox.Show("There are unsaved changes in this Script File.\nDo you wish to discard them?", "Unsaved work", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (!d.Equals(DialogResult.Yes)) {
Helpers.DisableHandlers();
// selectScriptFileComboBox.SelectedItem = currentScriptFile;
selectScriptFileComboBox.SelectedIndex = (int)currentScriptFile.fileID;
Helpers.EnableHandlers();
return false;
}
}
Helpers.DisableHandlers();
ScriptFile lastScriptFile = currentScriptFile;
// currentScriptFile = (ScriptFile)selectScriptFileComboBox.SelectedItem;
currentScriptFile = new ScriptFile(selectScriptFileComboBox.SelectedIndex); // Load script file
ScriptTextArea.ClearAll();
FunctionTextArea.ClearAll();
ActionTextArea.ClearAll();
scriptsNavListbox.Items.Clear();
functionsNavListbox.Items.Clear();
actionsNavListbox.Items.Clear();
//prevent buttons from flickering when the combobox selection changes
bool typeChanged = true;
if (lastScriptFile != null) {
typeChanged = lastScriptFile.isLevelScript != currentScriptFile.isLevelScript;
}
if (typeChanged) {
if (currentScriptFile.isLevelScript) {
importScriptFileButton.Location = initial_importScriptFileButton_location;
exportScriptFileButton.Location = initial_exportScriptFileButton_location;
addScriptFileButton.Location = initial_addScriptFileButton_location;
removeScriptFileButton.Location = initial_removeScriptFileButton_location;
viewLevelScriptButton.Location = new_viewLevelScript_location;
importScriptFileButton.Enabled = false;
exportScriptFileButton.Enabled = false;
addScriptFileButton.Enabled = false;
removeScriptFileButton.Enabled = false;
viewLevelScriptButton.Enabled = true;
} else {
importScriptFileButton.Location = new_importScriptFileButton_location;
exportScriptFileButton.Location = new_exportScriptFileButton_location;
addScriptFileButton.Location = new_addScriptFileButton_location;
removeScriptFileButton.Location = new_removeScriptFileButton_location;
viewLevelScriptButton.Location = initial_viewLevelScript_location;
importScriptFileButton.Enabled = true;
exportScriptFileButton.Enabled = true;
addScriptFileButton.Enabled = true;
removeScriptFileButton.Enabled = true;
viewLevelScriptButton.Enabled = false;
}
}
if (!currentScriptFile.isLevelScript) {
displayScriptFile(ScriptFile.ContainerTypes.Script, currentScriptFile.allScripts, scriptsNavListbox, ScriptTextArea);
displayScriptFile(ScriptFile.ContainerTypes.Function, currentScriptFile.allFunctions, functionsNavListbox, FunctionTextArea);
displayScriptFileActions(ScriptFile.ContainerTypes.Action, currentScriptFile.allActions, actionsNavListbox, ActionTextArea);
}
ScriptEditorSetClean();
Helpers.statusLabelMessage();
Helpers.EnableHandlers();
return true;
}
static void displayScriptFile(ScriptFile.ContainerTypes containerType, List commandList, ListBox navListBox, Scintilla textArea) {
string buffer = "";
/* Add commands */
for (int i = 0; i < commandList.Count; i++) {
ScriptCommandContainer scriptCommandContainer = commandList[i];
/* Write header */
string header = containerType + " " + (i + 1);
buffer += header + ':' + Environment.NewLine;
navListBox.Items.Add(header);
/* If current command is identical to another, print UseScript instead of commands */
if (scriptCommandContainer.usedScriptID < 0) {
for (int j = 0; j < scriptCommandContainer.commands.Count; j++) {
ScriptCommand command = scriptCommandContainer.commands[j];
if (!ScriptDatabase.endCodes.Contains(command.id)) {
buffer += '\t';
}
buffer += command.name + Environment.NewLine;
}
} else {
buffer += '\t' + "UseScript_#" + scriptCommandContainer.usedScriptID + Environment.NewLine;
}
textArea.AppendText(buffer + Environment.NewLine);
buffer = "";
}
}
static void displayScriptFileActions(ScriptFile.ContainerTypes containerType, List commandList, ListBox navListBox, Scintilla textArea) {
/* Add movements */
string buffer = "";
for (int i = 0; i < commandList.Count; i++) {
ScriptActionContainer currentCommand = commandList[i];
string header = containerType + " " + (i + 1);
buffer += header + ':' + Environment.NewLine;
navListBox.Items.Add(header);
for (int j = 0; j < currentCommand.commands.Count; j++) {
ScriptAction command = currentCommand.commands[j];
if (!ScriptDatabase.movementEndCodes.Contains(command.id)) {
buffer += '\t';
}
buffer += command.name + Environment.NewLine;
}
textArea.AppendText(buffer + Environment.NewLine);
buffer = "";
}
}
private void scriptEditorZoomInButton_Click(object sender, EventArgs e) {
ZoomIn(currentScintillaEditor);
}
private void scriptEditorZoomOutButton_Click(object sender, EventArgs e) {
ZoomOut(currentScintillaEditor);
}
private void scriptEditorZoomResetButton_Click(object sender, EventArgs e) {
ZoomDefault(currentScintillaEditor);
}
private void scriptEditorTabControl_TabIndexChanged(object sender, EventArgs e) {
if (scriptEditorTabControl.SelectedTab == scriptsTabPage) {
currentSearchManager = scriptSearchManager;
currentScintillaEditor = ScriptTextArea;
} else if (scriptEditorTabControl.SelectedTab == functionsTabPage) {
currentSearchManager = functionSearchManager;
currentScintillaEditor = FunctionTextArea;
} else {
//Actions
currentSearchManager = actionSearchManager;
currentScintillaEditor = ActionTextArea;
}
}
private void removeScriptFileButton_Click(object sender, EventArgs e) {
DialogResult d = MessageBox.Show("Are you sure you want to delete the last Script File?", "Confirm deletion", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (d.Equals(DialogResult.Yes)) {
/* Delete script file */
string path = Filesystem.GetScriptPath(selectScriptFileComboBox.Items.Count - 1);
File.Delete(path);
/* Check if currently selected file is the last one, and in that case select the one before it */
int lastIndex = selectScriptFileComboBox.Items.Count - 1;
if (selectScriptFileComboBox.SelectedIndex == lastIndex) {
selectScriptFileComboBox.SelectedIndex--;
}
/* Remove item from ComboBox */
selectScriptFileComboBox.Items.RemoveAt(lastIndex);
}
}
private void addScriptFileButton_Click(object sender, EventArgs e) {
/* Add new event file to event folder */
int fileID = selectScriptFileComboBox.Items.Count;
ScriptFile scriptFile = new ScriptFile(
scriptLines: new Scintilla { Text = "Script 1:\nEnd" }.Lines.ToStringsList(trim: true),
functionLines: null,
actionLines: null,
fileID
);
//check if ScriptFile instance was created successfully
if (scriptFile.SaveToFileDefaultDir(fileID, showSuccessMessage: false)) {
/* Update ComboBox and select new file */
selectScriptFileComboBox.Items.Add(scriptFile);
selectScriptFileComboBox.SelectedItem = scriptFile;
}
}
private void saveScriptFileButton_Click(object sender, EventArgs e) {
/* Create new ScriptFile object using the values in the script editor */
int fileID = currentScriptFile.fileID;
ScriptFile userEdited = new ScriptFile(
scriptLines: ScriptTextArea.Lines.ToStringsList(trim: true),
functionLines: FunctionTextArea.Lines.ToStringsList(trim: true),
actionLines: ActionTextArea.Lines.ToStringsList(trim: true),
fileID
);
if (userEdited.hasNoScripts) {
MessageBox.Show("This " + nameof(ScriptFile) + " couldn't be saved. A minimum of one script is required.", "Can't save", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
//check if ScriptFile instance was created successfully
if (userEdited.SaveToFileDefaultDir(fileID)) {
currentScriptFile = userEdited;
ScriptEditorSetClean();
}
}
private void exportScriptFileButton_Click(object sender, EventArgs e) {
currentScriptFile.SaveToFileExplorePath(currentScriptFile.ToString(), blindmode: true);
}
private void importScriptFileButton_Click(object sender, EventArgs e) {
/* Prompt user to select .scr or .bin file */
OpenFileDialog of = new OpenFileDialog {
Filter = "Script File (*.scr, *.bin)|*.scr;*.bin"
};
if (of.ShowDialog(this) != DialogResult.OK) {
return;
}
/* Update scriptFile object in memory */
int i = selectScriptFileComboBox.SelectedIndex;
string path = Filesystem.GetScriptPath(i);
File.Copy(of.FileName, path, true);
populate_selectScriptFileComboBox(i);
/* Refresh controls */
selectScriptFileComboBox_SelectedIndexChanged(null, null);
/* Display success message */
MessageBox.Show("Scripts imported successfully!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void viewLevelScriptButton_Click(object sender, EventArgs e) {
EditorPanels.levelScriptEditor.OpenLevelScriptEditor(this._parent, selectScriptFileComboBox.SelectedIndex);
}
private void locateCurrentScriptFile_Click(object sender, EventArgs e) {
string path = Filesystem.GetScriptPath(selectScriptFileComboBox.SelectedIndex);
Helpers.ExplorerSelect(path);
}
private void findNext(SearchManager searchManager) {
searchManager.Find(true, false);
scrollResultToTop(searchManager);
}
private void findPrev(SearchManager searchManager) {
searchManager.Find(false, false);
scrollResultToTop(searchManager);
}
private void findCurrent(SearchManager searchManager) {
searchManager.Find(true, true);
scrollResultToTop(searchManager);
}
private void TxtFindKeyDown(SearchManager searchManager, KeyEventArgs e) {
if (HotKeyManager.IsHotkey(e, Keys.Enter)) {
findNext(searchManager);
}
if (HotKeyManager.IsHotkey(e, Keys.Enter, true) || HotKeyManager.IsHotkey(e, Keys.Enter, false, true)) {
findPrev(searchManager);
}
}
private void BtnNextFindScript_Click(object sender, EventArgs e) {
findNext(scriptSearchManager);
}
private void BtnPrevFindScript_Click(object sender, EventArgs e) {
findPrev(scriptSearchManager);
}
private void panelFindScriptTextBox_TextChanged(object sender, EventArgs e) {
findCurrent(scriptSearchManager);
}
private void scriptTxtFind_KeyDown(object sender, KeyEventArgs e) {
TxtFindKeyDown(scriptSearchManager, e);
}
private void BtnCloseFindScript_Click(object sender, EventArgs e) {
scriptSearchManager.CloseSearch();
}
private void BtnNextFindFunc_Click(object sender, EventArgs e) {
findNext(functionSearchManager);
}
private void BtnPrevFindFunc_Click(object sender, EventArgs e) {
findNext(functionSearchManager);
}
private void panelFindFunctionTextBox_TextChanged(object sender, EventArgs e) {
findNext(functionSearchManager);
}
private void functionTxtFind_KeyDown(object sender, KeyEventArgs e) {
TxtFindKeyDown(functionSearchManager, e);
}
private void BtnCloseFindFunc_Click(object sender, EventArgs e) {
functionSearchManager.CloseSearch();
}
private void BtnNextFindActions_Click(object sender, EventArgs e) {
findNext(actionSearchManager);
}
private void BtnPrevFindActions_Click(object sender, EventArgs e) {
findNext(actionSearchManager);
}
private void panelFindActionTextBox_TextChanged(object sender, EventArgs e) {
findNext(actionSearchManager);
}
private void actionTxtFind_KeyDown(object sender, KeyEventArgs e) {
TxtFindKeyDown(actionSearchManager, e);
}
private void BtnCloseFindActions_Click(object sender, EventArgs e) {
actionSearchManager.CloseSearch();
}
void scrollResultToTop(SearchManager searchManager) {
int resultStart = searchManager.textAreaScintilla.CurrentLine - ScriptEditorSearchResult.ResultsPadding;
searchManager.textAreaScintilla.FirstVisibleLine = resultStart;
}
private void NavigatorGoTo(ListBox listBox, TabPage tabPage, SearchManager searchManager, ScriptFile.ContainerTypes containerType) {
if (listBox.SelectedIndex < 0) {
return;
}
scriptEditorTabControl.SelectedTab = tabPage;
int commandNumber = listBox.SelectedIndex + 1;
string CommandBlockOpen = $"{containerType} {commandNumber}:";
searchManager.Find(true, false, CommandBlockOpen);
scrollResultToTop(searchManager);
}
private void scriptsNavListbox_SelectedIndexChanged(object sender, EventArgs e) {
NavigatorGoTo((ListBox)sender, scriptsTabPage, scriptSearchManager, ScriptFile.ContainerTypes.Script);
}
private void functionsNavListbox_SelectedIndexChanged(object sender, EventArgs e) {
NavigatorGoTo((ListBox)sender, functionsTabPage, functionSearchManager, ScriptFile.ContainerTypes.Function);
}
private void actionsNavListbox_SelectedIndexChanged(object sender, EventArgs e) {
NavigatorGoTo((ListBox)sender, actionsTabPage, actionSearchManager, ScriptFile.ContainerTypes.Action);
}
private void openFindScriptEditorButton_Click(object sender, EventArgs e) {
currentSearchManager.OpenSearch();
}
private void ScriptEditorExpandButton_Click(object sender, EventArgs e) {
currentScintillaEditor.FoldAll(FoldAction.Expand);
}
private void ScriptEditorCollapseButton_Click(object sender, EventArgs e) {
currentScintillaEditor.FoldAll(FoldAction.Contract);
}
private void scriptEditorWordWrapCheckbox_CheckedChanged(object sender, EventArgs e) {
ScriptTextArea.WrapMode = scriptEditorWordWrapCheckbox.Checked ? WrapMode.Word : WrapMode.None;
FunctionTextArea.WrapMode = scriptEditorWordWrapCheckbox.Checked ? WrapMode.Word : WrapMode.None;
ActionTextArea.WrapMode = scriptEditorWordWrapCheckbox.Checked ? WrapMode.Word : WrapMode.None;
}
private void viewWhiteSpacesButton_Click(object sender, EventArgs e) {
ScriptTextArea.ViewWhitespace = scriptEditorWhitespacesCheckbox.Checked ? WhitespaceMode.VisibleAlways : WhitespaceMode.Invisible;
FunctionTextArea.ViewWhitespace = scriptEditorWhitespacesCheckbox.Checked ? WhitespaceMode.VisibleAlways : WhitespaceMode.Invisible;
ActionTextArea.ViewWhitespace = scriptEditorWhitespacesCheckbox.Checked ? WhitespaceMode.VisibleAlways : WhitespaceMode.Invisible;
}
private void searchInScriptsTextBox_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Enter) {
searchInScriptsButton_Click(null, null);
}
}
public List getScriptsToSearch() {
List scriptsToSearch = new List();
if (searchOnlyCurrentScriptCheckBox.Checked) {
this.UIThread(() => {
searchProgressBar.Maximum = 1;
});
int i = selectScriptFileComboBox.SelectedIndex;
ScriptFile scriptFile = new ScriptFile(i);
Console.WriteLine("Attempting to load script " + scriptFile.fileID);
scriptsToSearch.Add(scriptFile);
this.UIThread(() => {
searchProgressBar.IncrementNoAnimation();
});
} else {
this.UIThread(() => {
searchProgressBar.Maximum = selectScriptFileComboBox.Items.Count;
});
for (int i = 0; i < selectScriptFileComboBox.Items.Count; i++) {
ScriptFile scriptFile = new ScriptFile(i);
Console.WriteLine("Attempting to load script " + scriptFile.fileID);
scriptsToSearch.Add(scriptFile);
this.UIThread(() => {
searchProgressBar.IncrementNoAnimation();
});
}
}
return scriptsToSearch;
}
private void searchInScriptsButton_Click(object sender, EventArgs e) {
if (searchInScriptsTextBox.Text == "") {
return;
}
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (_sender, args) => {
this.UIThread(() => {
searchInScriptsResultListBox.Items.Clear();
searchProgressBar.Value = 0;
});
List scriptsToSearch = getScriptsToSearch();
string searchString = searchInScriptsTextBox.Text;
Func searchCriteriaCS = (string s) => s.IndexOf(searchString, StringComparison.InvariantCulture) >= 0;
Func searchCriteriaCI = (string s) => s.IndexOf(searchString, StringComparison.InvariantCultureIgnoreCase) >= 0;
Func searchCriteria = scriptSearchCaseSensitiveCheckBox.Checked ? searchCriteriaCS : searchCriteriaCI;
List results = new List();
foreach (ScriptFile scriptFile in scriptsToSearch) {
List scriptResults = SearchInScripts(scriptFile, scriptFile.allScripts, searchCriteria);
List functionResults = SearchInScripts(scriptFile, scriptFile.allFunctions, searchCriteria);
// List actionResults = SearchInScripts(scriptFile, scriptFile.allActions, searchCriteria);
results.AddRange(scriptResults);
results.AddRange(functionResults);
// results.AddRange(actionResults);
}
this.UIThread(() => {
searchInScriptsResultListBox.Items.AddRange(results.ToArray());
searchProgressBar.Value = 0;
});
};
bw.RunWorkerAsync();
}
private List SearchInScripts(ScriptFile scriptFile, List commandContainers, Func criteria) {
List results = new List();
for (int j = 0; j < commandContainers.Count; j++) {
if (commandContainers[j].commands is null) {
continue;
}
ScriptCommandContainer scriptCommandContainer = commandContainers[j];
foreach (ScriptCommand scriptCommand in scriptCommandContainer.commands) {
if (criteria(scriptCommand.name)) {
results.Add(new ScriptEditorSearchResult(scriptFile, scriptCommandContainer.containerType, j + 1, scriptCommand));
}
}
}
return results;
}
private void searchInScriptsResultListBox_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Enter) {
goToSearchResult();
}
}
private void searchInScripts_GoToEntryResult(object sender, MouseEventArgs e) {
goToSearchResult();
}
private void goToSearchResult() {
if (searchInScriptsResultListBox.SelectedItem == null) { return; }
ScriptEditorSearchResult searchResult = (ScriptEditorSearchResult)searchInScriptsResultListBox.SelectedItem;
ScriptFile scriptFile = searchResult.scriptFile;
ScriptFile.ContainerTypes containerType = searchResult.containerType;
selectScriptFileComboBox.SelectedIndex = scriptFile.fileID;
if (containerType == ScriptFile.ContainerTypes.Script) {
displaySearchResult(scriptsTabPage, scriptSearchManager, searchResult);
} else if (containerType == ScriptFile.ContainerTypes.Function) {
displaySearchResult(functionsTabPage, functionSearchManager, searchResult);
} else if (containerType == ScriptFile.ContainerTypes.Action) {
displaySearchResult(actionsTabPage, actionSearchManager, searchResult);
}
}
private void displaySearchResult(TabPage tabPage, SearchManager searchManager, ScriptEditorSearchResult searchResult) {
if (scriptEditorTabControl.SelectedTab != tabPage) {
scriptEditorTabControl.SelectedTab = tabPage;
}
searchManager.Find(true, false, searchResult.CommandBlockOpen);
int blockStart = searchManager.textAreaScintilla.CurrentLine - ScriptEditorSearchResult.ResultsPadding;
searchManager.Find(true, false, searchResult.scriptCommand.name);
int resultStart = searchManager.textAreaScintilla.CurrentLine - ScriptEditorSearchResult.ResultsPadding;
if (scrollToBlockStartcheckBox.Checked) {
searchManager.textAreaScintilla.FirstVisibleLine = blockStart;
} else {
searchManager.textAreaScintilla.FirstVisibleLine = resultStart;
}
}
}
public class ScriptEditorSearchResult {
public readonly ScriptFile scriptFile;
public readonly ScriptFile.ContainerTypes containerType;
public readonly int commandNumber;
public readonly ScriptCommand scriptCommand;
public const int ResultsPadding = 1;
public ScriptEditorSearchResult(ScriptFile scriptFile, ScriptFile.ContainerTypes containerType, int commandNumber, ScriptCommand scriptCommand) {
this.scriptFile = scriptFile;
this.containerType = containerType;
this.commandNumber = commandNumber;
this.scriptCommand = scriptCommand;
}
public string CommandBlockOpen { get { return $"{containerType} {commandNumber}:"; } }
public override string ToString() {
return $"File {scriptFile.fileID} - {CommandBlockOpen} {scriptCommand.name}";
}
}
}
================================================
FILE: DS_Map/Editors/ScriptEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/EventFileImport.Designer.cs
================================================
namespace DSPRE {
partial class EventFileImport {
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EventFileImport));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.triggersUncheckAllButton = new System.Windows.Forms.Button();
this.warpsUncheckAllButton = new System.Windows.Forms.Button();
this.overworldsUncheckAllButton = new System.Windows.Forms.Button();
this.spawnablesUncheckAllButton = new System.Windows.Forms.Button();
this.confirmButton = new System.Windows.Forms.Button();
this.importSpawnablesCheckBox = new System.Windows.Forms.CheckBox();
this.spawnablesCheckedListBox = new System.Windows.Forms.CheckedListBox();
this.overworldsCheckedListBox = new System.Windows.Forms.CheckedListBox();
this.warpsCheckedListBox = new System.Windows.Forms.CheckedListBox();
this.importWarpsCheckBox = new System.Windows.Forms.CheckBox();
this.importOverworldsCheckBox = new System.Windows.Forms.CheckBox();
this.importTriggersCheckBox = new System.Windows.Forms.CheckBox();
this.triggersCheckedListBox = new System.Windows.Forms.CheckedListBox();
this.spawnablesCheckAllButton = new System.Windows.Forms.Button();
this.overworldsCheckAllButton = new System.Windows.Forms.Button();
this.warpsCheckAllButton = new System.Windows.Forms.Button();
this.triggersCheckAllButton = new System.Windows.Forms.Button();
this.blankCurrentEventFileCheckbox = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 8;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 12.5F));
this.tableLayoutPanel1.Controls.Add(this.triggersUncheckAllButton, 7, 1);
this.tableLayoutPanel1.Controls.Add(this.warpsUncheckAllButton, 5, 1);
this.tableLayoutPanel1.Controls.Add(this.overworldsUncheckAllButton, 3, 1);
this.tableLayoutPanel1.Controls.Add(this.spawnablesUncheckAllButton, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.confirmButton, 6, 3);
this.tableLayoutPanel1.Controls.Add(this.importSpawnablesCheckBox, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.spawnablesCheckedListBox, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.overworldsCheckedListBox, 2, 2);
this.tableLayoutPanel1.Controls.Add(this.warpsCheckedListBox, 4, 2);
this.tableLayoutPanel1.Controls.Add(this.importWarpsCheckBox, 4, 0);
this.tableLayoutPanel1.Controls.Add(this.importOverworldsCheckBox, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.importTriggersCheckBox, 6, 0);
this.tableLayoutPanel1.Controls.Add(this.triggersCheckedListBox, 6, 2);
this.tableLayoutPanel1.Controls.Add(this.spawnablesCheckAllButton, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.overworldsCheckAllButton, 2, 1);
this.tableLayoutPanel1.Controls.Add(this.warpsCheckAllButton, 4, 1);
this.tableLayoutPanel1.Controls.Add(this.triggersCheckAllButton, 6, 1);
this.tableLayoutPanel1.Controls.Add(this.blankCurrentEventFileCheckbox, 5, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 93F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 7F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(959, 581);
this.tableLayoutPanel1.TabIndex = 0;
//
// triggersUncheckAllButton
//
this.triggersUncheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.triggersUncheckAllButton.Location = new System.Drawing.Point(838, 28);
this.triggersUncheckAllButton.Name = "triggersUncheckAllButton";
this.triggersUncheckAllButton.Size = new System.Drawing.Size(116, 23);
this.triggersUncheckAllButton.TabIndex = 20;
this.triggersUncheckAllButton.Text = "Uncheck All";
this.triggersUncheckAllButton.UseVisualStyleBackColor = true;
this.triggersUncheckAllButton.Click += new System.EventHandler(this.uncheckAllButtonClicked);
//
// warpsUncheckAllButton
//
this.warpsUncheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.warpsUncheckAllButton.Location = new System.Drawing.Point(600, 28);
this.warpsUncheckAllButton.Name = "warpsUncheckAllButton";
this.warpsUncheckAllButton.Size = new System.Drawing.Size(113, 23);
this.warpsUncheckAllButton.TabIndex = 19;
this.warpsUncheckAllButton.Text = "Uncheck All";
this.warpsUncheckAllButton.UseVisualStyleBackColor = true;
this.warpsUncheckAllButton.Click += new System.EventHandler(this.uncheckAllButtonClicked);
//
// overworldsUncheckAllButton
//
this.overworldsUncheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.overworldsUncheckAllButton.Location = new System.Drawing.Point(362, 28);
this.overworldsUncheckAllButton.Name = "overworldsUncheckAllButton";
this.overworldsUncheckAllButton.Size = new System.Drawing.Size(113, 23);
this.overworldsUncheckAllButton.TabIndex = 18;
this.overworldsUncheckAllButton.Text = "Uncheck All";
this.overworldsUncheckAllButton.UseVisualStyleBackColor = true;
this.overworldsUncheckAllButton.Click += new System.EventHandler(this.uncheckAllButtonClicked);
//
// spawnablesUncheckAllButton
//
this.spawnablesUncheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.spawnablesUncheckAllButton.Location = new System.Drawing.Point(124, 28);
this.spawnablesUncheckAllButton.Name = "spawnablesUncheckAllButton";
this.spawnablesUncheckAllButton.Size = new System.Drawing.Size(113, 23);
this.spawnablesUncheckAllButton.TabIndex = 17;
this.spawnablesUncheckAllButton.Text = "Uncheck All";
this.spawnablesUncheckAllButton.UseVisualStyleBackColor = true;
this.spawnablesUncheckAllButton.Click += new System.EventHandler(this.uncheckAllButtonClicked);
//
// confirmButton
//
this.confirmButton.AutoSize = true;
this.tableLayoutPanel1.SetColumnSpan(this.confirmButton, 2);
this.confirmButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.confirmButton.Location = new System.Drawing.Point(719, 545);
this.confirmButton.Name = "confirmButton";
this.confirmButton.Size = new System.Drawing.Size(235, 31);
this.confirmButton.TabIndex = 4;
this.confirmButton.Text = "Confirm";
this.confirmButton.UseVisualStyleBackColor = true;
this.confirmButton.Click += new System.EventHandler(this.confirmButton_Click);
//
// importSpawnablesCheckBox
//
this.importSpawnablesCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.importSpawnablesCheckBox.AutoSize = true;
this.importSpawnablesCheckBox.Checked = true;
this.importSpawnablesCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.tableLayoutPanel1.SetColumnSpan(this.importSpawnablesCheckBox, 2);
this.importSpawnablesCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.importSpawnablesCheckBox.Location = new System.Drawing.Point(73, 5);
this.importSpawnablesCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 5, 3);
this.importSpawnablesCheckBox.Name = "importSpawnablesCheckBox";
this.importSpawnablesCheckBox.Size = new System.Drawing.Size(94, 17);
this.importSpawnablesCheckBox.TabIndex = 8;
this.importSpawnablesCheckBox.Text = "Spawnables";
this.importSpawnablesCheckBox.UseVisualStyleBackColor = true;
this.importSpawnablesCheckBox.CheckedChanged += new System.EventHandler(this.importCheckBoxChanged);
//
// spawnablesCheckedListBox
//
this.tableLayoutPanel1.SetColumnSpan(this.spawnablesCheckedListBox, 2);
this.spawnablesCheckedListBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.spawnablesCheckedListBox.FormattingEnabled = true;
this.spawnablesCheckedListBox.Location = new System.Drawing.Point(5, 57);
this.spawnablesCheckedListBox.Name = "spawnablesCheckedListBox";
this.spawnablesCheckedListBox.Size = new System.Drawing.Size(232, 482);
this.spawnablesCheckedListBox.TabIndex = 9;
//
// overworldsCheckedListBox
//
this.tableLayoutPanel1.SetColumnSpan(this.overworldsCheckedListBox, 2);
this.overworldsCheckedListBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.overworldsCheckedListBox.FormattingEnabled = true;
this.overworldsCheckedListBox.Location = new System.Drawing.Point(243, 57);
this.overworldsCheckedListBox.Name = "overworldsCheckedListBox";
this.overworldsCheckedListBox.Size = new System.Drawing.Size(232, 482);
this.overworldsCheckedListBox.TabIndex = 10;
//
// warpsCheckedListBox
//
this.tableLayoutPanel1.SetColumnSpan(this.warpsCheckedListBox, 2);
this.warpsCheckedListBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.warpsCheckedListBox.FormattingEnabled = true;
this.warpsCheckedListBox.Location = new System.Drawing.Point(481, 57);
this.warpsCheckedListBox.Name = "warpsCheckedListBox";
this.warpsCheckedListBox.Size = new System.Drawing.Size(232, 482);
this.warpsCheckedListBox.TabIndex = 11;
//
// importWarpsCheckBox
//
this.importWarpsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.importWarpsCheckBox.AutoSize = true;
this.importWarpsCheckBox.Checked = true;
this.importWarpsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.tableLayoutPanel1.SetColumnSpan(this.importWarpsCheckBox, 2);
this.importWarpsCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.importWarpsCheckBox.Location = new System.Drawing.Point(565, 5);
this.importWarpsCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 5, 3);
this.importWarpsCheckBox.Name = "importWarpsCheckBox";
this.importWarpsCheckBox.Size = new System.Drawing.Size(62, 17);
this.importWarpsCheckBox.TabIndex = 5;
this.importWarpsCheckBox.Text = "Warps";
this.importWarpsCheckBox.UseVisualStyleBackColor = true;
this.importWarpsCheckBox.CheckedChanged += new System.EventHandler(this.importCheckBoxChanged);
//
// importOverworldsCheckBox
//
this.importOverworldsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.importOverworldsCheckBox.AutoSize = true;
this.importOverworldsCheckBox.Checked = true;
this.importOverworldsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.tableLayoutPanel1.SetColumnSpan(this.importOverworldsCheckBox, 2);
this.importOverworldsCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.importOverworldsCheckBox.Location = new System.Drawing.Point(313, 5);
this.importOverworldsCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 5, 3);
this.importOverworldsCheckBox.Name = "importOverworldsCheckBox";
this.importOverworldsCheckBox.Size = new System.Drawing.Size(89, 17);
this.importOverworldsCheckBox.TabIndex = 1;
this.importOverworldsCheckBox.Text = "Overworlds";
this.importOverworldsCheckBox.UseVisualStyleBackColor = true;
this.importOverworldsCheckBox.CheckedChanged += new System.EventHandler(this.importCheckBoxChanged);
//
// importTriggersCheckBox
//
this.importTriggersCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.importTriggersCheckBox.AutoSize = true;
this.importTriggersCheckBox.Checked = true;
this.importTriggersCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.tableLayoutPanel1.SetColumnSpan(this.importTriggersCheckBox, 2);
this.importTriggersCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.importTriggersCheckBox.Location = new System.Drawing.Point(799, 5);
this.importTriggersCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 5, 3);
this.importTriggersCheckBox.Name = "importTriggersCheckBox";
this.importTriggersCheckBox.Size = new System.Drawing.Size(72, 17);
this.importTriggersCheckBox.TabIndex = 2;
this.importTriggersCheckBox.Text = "Triggers";
this.importTriggersCheckBox.UseVisualStyleBackColor = true;
this.importTriggersCheckBox.CheckedChanged += new System.EventHandler(this.importCheckBoxChanged);
//
// triggersCheckedListBox
//
this.tableLayoutPanel1.SetColumnSpan(this.triggersCheckedListBox, 2);
this.triggersCheckedListBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.triggersCheckedListBox.FormattingEnabled = true;
this.triggersCheckedListBox.Location = new System.Drawing.Point(719, 57);
this.triggersCheckedListBox.Name = "triggersCheckedListBox";
this.triggersCheckedListBox.Size = new System.Drawing.Size(235, 482);
this.triggersCheckedListBox.TabIndex = 12;
//
// spawnablesCheckAllButton
//
this.spawnablesCheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.spawnablesCheckAllButton.Location = new System.Drawing.Point(5, 28);
this.spawnablesCheckAllButton.Name = "spawnablesCheckAllButton";
this.spawnablesCheckAllButton.Size = new System.Drawing.Size(113, 23);
this.spawnablesCheckAllButton.TabIndex = 13;
this.spawnablesCheckAllButton.Text = "Check All";
this.spawnablesCheckAllButton.UseVisualStyleBackColor = true;
this.spawnablesCheckAllButton.Click += new System.EventHandler(this.checkAllButtonClicked);
//
// overworldsCheckAllButton
//
this.overworldsCheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.overworldsCheckAllButton.Location = new System.Drawing.Point(243, 28);
this.overworldsCheckAllButton.Name = "overworldsCheckAllButton";
this.overworldsCheckAllButton.Size = new System.Drawing.Size(113, 23);
this.overworldsCheckAllButton.TabIndex = 14;
this.overworldsCheckAllButton.Text = "Check All";
this.overworldsCheckAllButton.UseVisualStyleBackColor = true;
this.overworldsCheckAllButton.Click += new System.EventHandler(this.checkAllButtonClicked);
//
// warpsCheckAllButton
//
this.warpsCheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.warpsCheckAllButton.Location = new System.Drawing.Point(481, 28);
this.warpsCheckAllButton.Name = "warpsCheckAllButton";
this.warpsCheckAllButton.Size = new System.Drawing.Size(113, 23);
this.warpsCheckAllButton.TabIndex = 15;
this.warpsCheckAllButton.Text = "Check All";
this.warpsCheckAllButton.UseVisualStyleBackColor = true;
this.warpsCheckAllButton.Click += new System.EventHandler(this.checkAllButtonClicked);
//
// triggersCheckAllButton
//
this.triggersCheckAllButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.triggersCheckAllButton.Location = new System.Drawing.Point(719, 28);
this.triggersCheckAllButton.Name = "triggersCheckAllButton";
this.triggersCheckAllButton.Size = new System.Drawing.Size(113, 23);
this.triggersCheckAllButton.TabIndex = 16;
this.triggersCheckAllButton.Text = "Check All";
this.triggersCheckAllButton.UseVisualStyleBackColor = true;
this.triggersCheckAllButton.Click += new System.EventHandler(this.checkAllButtonClicked);
//
// blankCurrentEventFileCheckbox
//
this.blankCurrentEventFileCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.blankCurrentEventFileCheckbox.AutoSize = true;
this.blankCurrentEventFileCheckbox.Checked = true;
this.blankCurrentEventFileCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.blankCurrentEventFileCheckbox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.blankCurrentEventFileCheckbox.Location = new System.Drawing.Point(600, 545);
this.blankCurrentEventFileCheckbox.Margin = new System.Windows.Forms.Padding(3, 3, 5, 3);
this.blankCurrentEventFileCheckbox.Name = "blankCurrentEventFileCheckbox";
this.blankCurrentEventFileCheckbox.Size = new System.Drawing.Size(111, 31);
this.blankCurrentEventFileCheckbox.TabIndex = 21;
this.blankCurrentEventFileCheckbox.Text = "Import on empty file";
this.blankCurrentEventFileCheckbox.UseVisualStyleBackColor = true;
this.blankCurrentEventFileCheckbox.CheckedChanged += new System.EventHandler(this.blankCurrentEventFileCheckbox_CheckedChanged);
//
// EventFileImport
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(965, 587);
this.Controls.Add(this.tableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "EventFileImport";
this.Padding = new System.Windows.Forms.Padding(3);
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Event Importer";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.CheckBox importTriggersCheckBox;
private System.Windows.Forms.CheckBox importOverworldsCheckBox;
private System.Windows.Forms.Button confirmButton;
private System.Windows.Forms.CheckBox importWarpsCheckBox;
private System.Windows.Forms.CheckBox importSpawnablesCheckBox;
private System.Windows.Forms.CheckedListBox spawnablesCheckedListBox;
private System.Windows.Forms.CheckedListBox overworldsCheckedListBox;
private System.Windows.Forms.CheckedListBox warpsCheckedListBox;
private System.Windows.Forms.CheckedListBox triggersCheckedListBox;
private System.Windows.Forms.Button triggersUncheckAllButton;
private System.Windows.Forms.Button warpsUncheckAllButton;
private System.Windows.Forms.Button overworldsUncheckAllButton;
private System.Windows.Forms.Button spawnablesUncheckAllButton;
private System.Windows.Forms.Button spawnablesCheckAllButton;
private System.Windows.Forms.Button overworldsCheckAllButton;
private System.Windows.Forms.Button warpsCheckAllButton;
private System.Windows.Forms.Button triggersCheckAllButton;
private System.Windows.Forms.CheckBox blankCurrentEventFileCheckbox;
}
}
================================================
FILE: DS_Map/EventFileImport.cs
================================================
using DSPRE;
using DSPRE.ROMFiles;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using static DSPRE.ROMFiles.EventFile;
namespace DSPRE {
public partial class EventFileImport : Form {
private static readonly int eventTypesCount = Enum.GetValues(typeof(serializationOrder)).Length;
private readonly bool[] toImport = new bool[eventTypesCount];
private readonly CheckedListBox[] listBoxes;
private readonly Button[,] checkButtons;
public readonly int[][] userSelected = new int[eventTypesCount][];
private bool _blankCurrentEvents;
public bool blankCurrentEvents {
get { return _blankCurrentEvents; }
set { _blankCurrentEvents = value; }
}
public EventFileImport(EventFile ef) {
InitializeComponent();
blankCurrentEvents = blankCurrentEventFileCheckbox.Checked;
for (int i = 0; i < toImport.Length; i++) {
toImport[i] = true;
}
listBoxes = new CheckedListBox[] {
spawnablesCheckedListBox,
overworldsCheckedListBox,
warpsCheckedListBox,
triggersCheckedListBox
};
checkButtons = new Button[4, 2] {
{ spawnablesCheckAllButton, spawnablesUncheckAllButton },
{ overworldsCheckAllButton, overworldsUncheckAllButton },
{ warpsCheckAllButton, warpsUncheckAllButton },
{ triggersCheckAllButton, triggersUncheckAllButton }
};
foreach (Spawnable s in ef.spawnables) {
listBoxes[(int)serializationOrder.Spawnables].Items.Add(s);
}
foreach (Overworld ow in ef.overworlds) {
listBoxes[(int)serializationOrder.Overworlds].Items.Add(ow);
}
foreach (Warp w in ef.warps) {
listBoxes[(int)serializationOrder.Warps].Items.Add(w);
}
foreach (Trigger t in ef.triggers) {
listBoxes[(int)serializationOrder.Triggers].Items.Add(t);
}
foreach (CheckedListBox clb in listBoxes) {
clb.SetAllItemsChecked(true);
}
}
private void confirmButton_Click(object sender, EventArgs e) {
bool ok = false;
for (int i = 0; i < toImport.Length; i++) {
if (toImport[i] && listBoxes[i].CheckedItems.Count > 0) {
userSelected[i] = listBoxes[i].CheckedIndices.Cast().ToArray();
if (userSelected[i].Length > 0) {
ok = true;
}
}
}
if (ok) {
DialogResult = DialogResult.OK;
this.Dispose();
return;
}
MessageBox.Show("You must tick at least one element.", "No selection performed", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void importCheckBoxChanged(object sender, EventArgs e) {
//Changing the checkboxes' columns in the GUI will break this
CheckBox c = sender as CheckBox;
int typeIndex = tableLayoutPanel1.GetPositionFromControl(c).Column;
bool v = toImport[typeIndex / 2] =
listBoxes[typeIndex / 2].Enabled
= c.Checked;
for (int i = 0; i < 2; i++) {
checkButtons[typeIndex / 2, i].Enabled = v;
}
}
private void checkAllButtonClicked(object sender, EventArgs e) {
listBoxes[tableLayoutPanel1.GetPositionFromControl(sender as Button).Column / 2].SetAllItemsChecked(true);
}
private void uncheckAllButtonClicked(object sender, EventArgs e) {
listBoxes[tableLayoutPanel1.GetPositionFromControl(sender as Button).Column / 2].SetAllItemsChecked(false);
}
private void blankCurrentEventFileCheckbox_CheckedChanged(object sender, EventArgs e) {
blankCurrentEvents = blankCurrentEventFileCheckbox.Checked;
}
}
}
================================================
FILE: DS_Map/EventFileImport.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
AAABAAEAlpYAAAEAIABwawEAFgAAACgAAACWAAAALAEAAAEAIAAAAAAAkF8BAMMOAADDDgAAAAAAAAAA
AAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgGAICYEQCAmCYAgJhKAICYewCAmLEAgJjhAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmOEAgJixAICYewCAmEoAgJgmAICYEQCA
mAYAgJgwAICYOQCAmEoAgJhpAICYkgCAmL4AgJjmAICY/ACAmP8AgJj/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wCAmP8AgJj/AICY/ACAmOYAgJi+AICYkgCAmGkAgJhKAICYOQCA
mDAAgJhoAICYbwCAmHsAgJiSAICYrwCAmNAAgJjtAICY/QB/l/8Af5f/AH+X/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+X/wB/l/8Af5f/AICY/QCAmO0AgJjQAICYrwCAmJIAgJh7AICYbwCA
mGgAgJimAICYqgCAmLEAgJi+AICY0ACAmOMAgJj0AICY/gB/l/8Af5f/AH+W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+W/wB/l/8Af5f/AICY/gCAmPQAgJjjAICY0ACAmL4AgJixAICYqgCA
mKYAgJjcAICY3gCAmOEAgJjmAICY7QCAmPQAgJj7AICY/wCAmP8AgJj/AICY/wCAmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCAmf8AgJn/AICZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AICZ/wCAmf8AgJn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgJn/AICY/wCAmP8AgJj/AICY/wCAmPsAgJj0AICY7QCAmOYAgJjhAICY3gCA
mNwAgJj7AICY/ACAmPwAgJj8AICY/QCAmP4AgJj/AIGZ/wCCmv8Ag5z/AIWe/wCGn/8Ah5//AIeg/wCH
oP8Ah6D/AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
n/8Ah5//AIef/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCH
oP8Bh6D/A4ig/wSIof8FiaH/Bomh/weJof8HiaH/B4mh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/B4mh/weJof8HiaH/Bomh/wWJof8EiKH/A4ig/wGH
oP8Ah6D/AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIef/wCH
n/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
oP8Ah6D/AIeg/wCHn/8Ahp//AIWe/wCDnP8Agpr/AIGZ/wCAmP8AgJj+AICY/QCAmPwAgJj8AICY/ACA
mPsAgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIKa/wCFnv8AiaL/AI2n/wCQqv8Akaz/AJKs/wCR
rP8Akaz/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wGR
q/8Dkqz/B5St/wuVrv8Ol6//EJiw/xGYsP8RmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xGYsP8RmLD/EJiw/w6Xr/8Lla7/B5St/wOS
rP8Bkav/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
rP8Akaz/AJKs/wCRrP8AkKr/AI2n/wCJov8AhZ7/AIKa/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIOc/wCJov8AkKr/AJax/wCbt/8Anrr/AJ+7/wCe
u/8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrr/AJ26/wCduv8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCcuf8AnLn/AJ25/wKd
uv8GoLv/DKK9/xOlv/8ZqMH/HarC/x6qwv8eqsL/HarC/xyqwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8cqsL/HarC/x6qwv8eqsL/HarC/xmowf8Tpb//DKK9/wag
u/8Cnbr/AJ25/wCcuf8AnLn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbr/AJ26/wCe
uv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrv/AJ+7/wCeuv8Am7f/AJax/wCQqv8AiaL/AIOc/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH+W/wB/lv8AgJj/AIWe/wCNp/8AlrH/AJ+8/wCnxP8Aqsj/AKvK/wCr
yf8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKnI/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnH/wCpx/8Aqcf/AKnH/wKq
yP8Ircr/EbHN/xu10P8judL/KbvU/yu81P8rvNT/KrzU/ym71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8pu9T/KrzU/yu81P8rvNT/KbvU/yO50v8btdD/EbHN/wit
yv8Cqsj/AKnH/wCpx/8Aqcf/AKnH/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aq8n/AKvK/wCqyP8Ap8T/AJ+8/wCWsf8Ajaf/AIWe/wCAmP8Af5b/AH+W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQqv8Am7f/AKfE/wCvzv8AtNP/ALXV/wC1
1P8AtNP/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz
0/8As9P/ALTT/wG00/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8As9P/AbTT/wS1
1P8Mudb/Fr3Z/yLC3P8sxt//Msnh/zXK4v82y+L/Nsri/zXK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v81yuL/Nsri/zbL4v81yuL/Msnh/yzG3/8iwtz/Fr3Z/wy5
1v8EtdT/AbTT/wCz0/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8BtNP/ALTT/wCz
0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wC0
0/8AtdT/ALXV/wC00/8Ar87/AKfE/wCbt/8AkKr/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALrb/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC4
2P8BuNj/ArnZ/wS62f8Gu9r/CLzb/wm82/8Kvdv/Cr3b/wq82/8JvNv/Cbzb/wi82/8HvNv/CLzb/wu9
3P8SwN7/HMTh/yfJ5P8wzeb/ONDo/zzS6f8/0+r/QdTq/0LU6v9D1er/Q9Xq/0PV6v9D1er/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PV6v9D1er/Q9Xq/0PV6v9C1Or/QdTq/z/T6v880un/ONDo/zDN5v8nyeT/HMTh/xLA
3v8Lvdz/CLzb/we82/8IvNv/Cbzb/wm82/8KvNv/Cr3b/wq92/8JvNv/CLzb/wa72v8Eutn/ArnZ/wG4
2P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALrb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCSrP8An7v/AKvK/wC11f8Autv/ALzd/wC8
3P8Au9v/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALna/wC5
2v8Butr/BLvb/wm93f8OwN7/EsHf/xTD4P8Vw+D/FsPg/xXD4P8Vw+D/FMPg/xPC4P8SwuD/E8Lg/xXD
4f8axeL/Isnk/yrM5/8y0On/OdPr/0DV7P9G1+3/S9nt/0/b7f9R3O7/Utzu/1Lc7v9R3O7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Hc7v9S3O7/Utzu/1Hc7v9P2+3/S9nt/0bX7f9A1ez/OdPr/zLQ6f8qzOf/Isnk/xrF
4v8Vw+H/E8Lg/xLC4P8TwuD/FMPg/xXD4P8Vw+D/FsPg/xXD4P8Uw+D/EsHf/w7A3v8Jvd3/BLvb/wG6
2v8Audr/ALna/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC7
2/8AvNz/ALzd/wC62/8AtdX/AKvK/wCfu/8Akqz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrv/AKvJ/wC11P8Autr/ALzc/wC7
3P8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC52v8Audn/ALnZ/wC5
2f8Cutr/B7zb/w6/3v8Ww+D/Hcbi/yHI4/8jyOT/I8nk/yLI5P8iyOP/Icjj/yDH4/8fx+P/H8fj/yHI
5P8kyeT/KMvm/y3N5/8z0On/OtPq/0PW7P9M2e3/Vd3u/1zf7/9g4e//YeHv/2Dh7/9f4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/1/g7/9g4e//YeHv/2Dh7/9c3+//Vd3u/0zZ7f9D1uz/OtPq/zPQ6f8tzef/KMvm/yTJ
5P8hyOT/H8fj/x/H4/8gx+P/Icjj/yLI4/8iyOT/I8nk/yPI5P8hyOP/Hcbi/xbD4P8Ov97/B7zb/wK6
2v8Audn/ALnZ/wC52f8Audr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC6
2v8Au9z/ALzc/wC62v8AtdT/AKvJ/wCeu/8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALvb/wC6
2v8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC42f8AuNj/ALjY/wC4
2P8Dudn/Crzb/xPB3v8exeH/J8nk/yzM5f8vzeb/L83m/y7M5v8tzOb/Lczm/y3M5f8szOX/Lczl/y3M
5v8uzOb/MM3n/zLO5/820Oj/PNLp/0bW6v9S2uz/Xd/t/2fi7/9s5O//buXv/27l7/9t5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/23k7/9u5e//buXv/2zk7/9n4u//Xd/t/1La7P9G1ur/PNLp/zbQ6P8yzuf/MM3n/y7M
5v8tzOb/Lczl/yzM5f8tzOX/Lczm/y3M5v8uzOb/L83m/y/N5v8szOX/J8nk/x7F4f8Twd7/Crzb/wO5
2f8AuNj/ALjY/wC42P8AuNn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC5
2f8Autr/ALvb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK5
2f8Gu9r/Dr7c/xnD3/8kyOL/Lszl/zTO5/83z+j/N9Do/zbP6P82z+f/Ns/n/zfP5/840Oj/OdDo/zrQ
6P860Oj/OdDo/znQ6P880ej/QdPp/0vX6v9Y3Oz/ZeHu/2/l7/915/D/eOjw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eOjw/3Xn8P9v5e//ZeHu/1jc7P9L1+r/QdPp/zzR6P850Oj/OdDo/zrQ
6P860Oj/OdDo/zjQ6P83z+f/Ns/n/zbP5/82z+j/N9Do/zfP6P80zuf/Lszl/yTI4v8Zw9//Dr7c/wa7
2v8Cudn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK42P8Dudn/Brra/wm8
2/8Pvtz/FsLe/yDG4f8qyuT/Ms3m/zfQ6P850en/OdHp/znQ6P850Oj/O9Hp/z7S6f9B0+n/RNXq/0fW
6v9H1ur/RtXq/0XV6v9G1er/Stfq/1Pa6/9e3u3/aePu/3Pm7/966fD/f+vx/4Ps8v+F7fP/h+3z/4ju
9P+J7vT/iO/0/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv
9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/0/4nu
9P+I7vT/h+3z/4Xt8/+D7PL/f+vx/3rp8P9z5u//aePu/17e7f9T2uv/Stfq/0bV6v9F1er/RtXq/0fW
6v9H1ur/RNXq/0HT6f8+0un/O9Hp/znQ6P850Oj/OdHp/znR6f830Oj/Ms3m/yrK5P8gxuH/FsLe/w++
3P8JvNv/Brra/wO52f8CuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC31/8At9f/AbjY/wS52f8Iu9r/Db3c/xPA
3f8Zw9//IMbh/yfJ4/8uzOX/NM7n/zfQ6P840On/ONDp/zjQ6P850Oj/PNLp/0PU6v9J1+v/UNnr/1Tb
7P9W2+z/Vdvs/1Pa7P9T2uv/Vtvs/1ze7P9k4e3/bOTu/3Xn8P996vH/hO3y/4zv9P+S8fX/l/P3/5n0
+P+Z9fn/mfb5/5j2+v+X9vv/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3
+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f2+/+Y9vr/mfb5/5n1
+f+Z9Pj/l/P3/5Lx9f+M7/T/hO3y/33q8f915/D/bOTu/2Th7f9c3uz/Vtvs/1Pa6/9T2uz/Vdvs/1bb
7P9U2+z/UNnr/0nX6/9D1Or/PNLp/znQ6P840Oj/ONDp/zjQ6f830Oj/NM7n/y7M5f8nyeP/IMbh/xnD
3/8TwN3/Db3c/wi72v8Eudn/AbjY/wC31/8At9f/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALfY/wC31/8At9f/AbjY/wa62f8Nvdv/FcHe/x7F
4P8lyOL/Ksrk/y7M5f8yzuf/Nc/n/zfQ6P830Oj/Ns/o/zbP6P840Oj/PtLp/0fW6v9R2ev/W93t/2Hg
7f9k4e7/ZOHu/2Pg7f9i4O3/Y+Dt/2bh7v9q4+7/cOXv/3bn8P9+6vH/h+3z/5Lx9f+b9Pf/ovb4/6X4
+v+m+fv/pfr8/6T6/P+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6
/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+k+vz/pfr8/6b5
+/+l+Pr/ovb4/5v09/+S8fX/h+3z/37q8f925/D/cOXv/2rj7v9m4e7/Y+Dt/2Lg7f9j4O3/ZOHu/2Th
7v9h4O3/W93t/1HZ6/9H1ur/PtLp/zjQ6P82z+j/Ns/o/zfQ6P830Oj/Nc/n/zLO5/8uzOX/Ksrk/yXI
4v8exeD/FcHe/w292/8Gutn/AbjY/wC31/8At9f/ALfY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC32P8AuNj/ArnY/wi72v8Rv93/HMTg/yfJ
4/8uzOX/M87n/zbP5/830Oj/ONDo/zjQ6P840Oj/N9Do/zfQ6P860ej/QdPp/0vX6v9Y3Oz/ZODu/2zk
7/9w5e//ceXv/3Hl7/9w5e//cOXv/3Hl7/9y5u//defw/3jo8P9/6vH/iO3y/5Pw9P+d8vX/pfT2/6j1
9v+q9vb/qfX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j1
9v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qfX2/6r2
9v+o9fb/pfT2/53y9f+T8PT/iO3y/3/q8f946PD/defw/3Lm7/9x5e//cOXv/3Dl7/9x5e//ceXv/3Dl
7/9s5O//ZODu/1jc7P9L1+r/QdPp/zrR6P830Oj/N9Do/zjQ6P840Oj/ONDo/zfQ6P82z+f/M87n/y7M
5f8nyeP/HMTg/xG/3f8Iu9r/ArnY/wC42P8At9j/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8BuNj/AbjY/wG52P8Dudn/B7va/w6+3P8Xwt//I8fi/y3L
5f81z+f/OdHo/zzS6f890un/PtLp/z/S6f8+0un/PdLp/z3S6f9A0+n/R9bq/1La6/9f3u3/a+Pu/3Tm
7/956PD/e+nx/3zp8f996fH/ferx/33q8f996vH/ferx/3/q8f+C6vH/iOvx/4/r8P+V6+//muvt/53p
6/+f5+j/oOXl/6Hj4/+h4uH/oeHg/6Hh4P+h4eD/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh
4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4P+h4eD/oeHg/6Hi4f+h4+P/oOXl/5/n
6P+d6ev/muvt/5Xr7/+P6/D/iOvx/4Lq8f9/6vH/ferx/33q8f996vH/ferx/33p8f986fH/e+nx/3no
8P905u//a+Pu/1/e7f9S2uv/R9bq/0DT6f890un/PdLp/z7S6f8/0un/PtLp/z3S6f880un/OdHo/zXP
5/8ty+X/I8fi/xfC3/8Ovtz/B7va/wO52f8Budj/AbjY/wG42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALfY/wC42P8CuNj/BLnZ/we72v8Lvdv/EL/d/xbC3v8fxeH/KMnk/zDN
5v830Oj/PdLp/0LU6v9F1er/SNbq/0rX6v9K1+r/Sdbq/0nW6v9L1+r/UNnr/1nd7P9k4e3/buTv/3fo
8P9+6vH/g+zy/4fu8/+L7/T/jfD1/47x9v+N8fb/jPH3/4vw9v+J7fP/hunw/4Pk6/+A3uX/f9jf/4DS
1/+DzM//h8bH/4rBwP+Mvbv/jby5/427uP+NvLn/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428
uv+NvLr/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428uf+Nu7j/jby5/4y9u/+KwcD/h8bH/4PM
z/+A0tf/f9jf/4De5f+D5Ov/hunw/4nt8/+L8Pb/jPH3/43x9v+O8fb/jfD1/4vv9P+H7vP/g+zy/37q
8f936PD/buTv/2Th7f9Z3ez/UNnr/0vX6v9J1ur/Sdbq/0rX6v9K1+r/SNbq/0XV6v9C1Or/PdLp/zfQ
6P8wzeb/KMnk/x/F4f8Wwt7/EL/d/wu92/8Hu9r/BLnZ/wK42P8AuNj/ALfY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8At9f/ALfX/wC32P8Dudj/CLva/w6+3P8Uwd7/G8Pg/yHG4f8nyeP/LMvl/zLO
5/840Oj/P9Pp/0fW6v9O2Ov/VNvs/1jc7P9Z3Oz/WNzs/1fc7P9Y3Oz/XN7s/2Hg7f9p4u7/cOXv/3jo
8P+A6/L/ie7z/5Hx9f+Y8/f/nPX4/573+v+f+fz/nfn8/5n2+v+Q8PX/gubt/3PZ4/9kzNj/W8DL/1q0
vv9eqa//ZJ6g/2uVlP9vj4v/cYyI/3GMh/9xjYj/cI2J/3COif9wjon/cI6J/3COif9wjon/cI6J/3CO
if9wjon/cI6J/3COif9wjon/cI6J/3COif9wjon/cI2J/3GNiP9xjIf/cYyI/2+Pi/9rlZT/ZJ6g/16p
r/9atL7/W8DL/2TM2P9z2eP/gubt/5Dw9f+Z9vr/nfn8/5/5/P+e9/r/nPX4/5jz9/+R8fX/ie7z/4Dr
8v946PD/cOXv/2ni7v9h4O3/XN7s/1jc7P9X3Oz/WNzs/1nc7P9Y3Oz/VNvs/07Y6/9H1ur/P9Pp/zjQ
6P8yzuf/LMvl/yfJ4/8hxuH/G8Pg/xTB3v8Ovtz/CLva/wO52P8At9j/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8At9f/ALfX/wC42P8Eudn/DL3b/xXB3v8exeD/Jsjj/yvL5P8uzOb/Mc3m/zTO
5/850ej/QtTp/0zY6/9X3Oz/YN/t/2bh7v9o4u7/Z+Lu/2bi7v9m4e7/aOLu/2vj7v9u5e//c+bv/3no
8P+B6/L/jO/0/5fy9f+g9ff/pvf5/6r6+/+s/P3/qvz9/6P4+v+U7vL/fd7m/2HL1/9It8f/OKW1/zOU
ov84hI3/QnZ5/0xqaP9RYVz/VF1X/1RdVv9TXlf/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1Nf
Wf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NeV/9UXVb/VF1X/1FhXP9Mamj/QnZ5/ziE
jf8zlKL/OKW1/0i3x/9hy9f/fd7m/5Tu8v+j+Pr/qvz9/6z8/f+q+vv/pvf5/6D19/+X8vX/jO/0/4Hr
8v956PD/c+bv/27l7/9r4+7/aOLu/2bh7v9m4u7/Z+Lu/2ji7v9m4e7/YN/t/1fc7P9M2Ov/QtTp/znR
6P80zuf/Mc3m/y7M5v8ry+T/Jsjj/x7F4P8Vwd7/DL3b/wS52f8AuNj/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wK52P8Hu9r/EL/d/xvD4P8myOP/L8zl/zTO5/82z+f/Ns/o/zjQ
6P890un/RtXq/1La6/9f3+3/auPu/3Hl7/905/D/defw/3Tn8P905vD/dOfw/3Xn8P925/D/eOjw/3zp
8P+D6/H/jO3y/5bv8/+f8vT/pfP0/6r19f+t9vb/rPX1/6Xv8P+T4+b/ddDY/1K5xv8yobL/HYye/xd4
iP8dZXD/KFVY/zNHRP86PTf/PTkx/z04MP88OTH/PDoz/zw7M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7
M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7M/88OzP/PDoz/zw5Mf89ODD/PTkx/zo9N/8zR0T/KFVY/x1l
cP8XeIj/HYye/zKhsv9Sucb/ddDY/5Pj5v+l7/D/rPX1/6329v+q9fX/pfP0/5/y9P+W7/P/jO3y/4Pr
8f986fD/eOjw/3bn8P915/D/dOfw/3Tm8P905/D/defw/3Tn8P9x5e//auPu/1/f7f9S2uv/RtXq/z3S
6f840Oj/Ns/o/zbP5/80zuf/L8zl/ybI4/8bw+D/EL/d/we72v8Cudj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2v8AuNn/AbjY/wG42P8Cudn/BLrZ/wi72v8Ovtz/FsLe/yHG4f8ry+T/NM7n/znQ6P880en/PdLp/0DT
6f9F1er/Ttjr/1nc7P9l4e7/cOXv/3jo8P986fH/furx/4Dq8f+A6vH/gevy/4Hr8v+B7PL/gezz/4Pr
8v+F6/H/ierw/43o7v+R5+v/leXo/5nk5v+e4uP/n9/e/5nX1/+Iysz/are9/0ihrP8oipn/EnWF/wxi
cP8RUFn/HD9C/ycyL/8tKSH/LyQb/zAjGv8vJBz/LiYe/y4mHv8uJh7/LiYe/y4mHv8uJh7/LiYe/y4m
Hv8uJh7/LiYe/y4mHv8uJh7/LiYe/y4mHv8uJh7/LiYe/y8kHP8wIxr/LyQb/y0pIf8nMi//HD9C/xFQ
Wf8MYnD/EnWF/yiKmf9Ioaz/are9/4jKzP+Z19f/n9/e/57i4/+Z5Ob/leXo/5Hn6/+N6O7/ierw/4Xr
8f+D6/L/gezz/4Hs8v+B6/L/gevy/4Dq8f+A6vH/furx/3zp8f946PD/cOXv/2Xh7v9Z3Oz/Ttjr/0XV
6v9A0+n/PdLp/zzR6f850Oj/NM7n/yvL5P8hxuH/FsLe/w6+3P8Iu9r/BLrZ/wK52f8BuNj/AbjY/wC4
2f8Audr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2f8AuNj/AbjY/wS52f8Iu9r/DL3b/xG/3f8Xwt//H8Xh/yfJ4/8uzOb/Ns/n/zzR6f9B0+n/RdXq/0rX
6v9Q2ev/WNzs/2Hf7f9q4+7/c+bv/3rp8P+A6/H/huzy/4rt8v+N7vP/kPD0/5Hx9v+R8/f/kPP4/47x
9v+J7PP/g+bt/3ze5v921t7/dM7W/3jIzf9+wcT/grq6/4Cwr/9zo6P/XJOV/z+Bh/8lb3j/E11p/w5O
V/8RPkT/GDEx/yElIf8lHRb/JxoR/ycZEP8nGhH/JhsS/yYbE/8mGxP/JhsT/ycbE/8nGxP/JxsT/ycb
E/8nGxP/JxsT/ycbE/8nGxP/JhsT/yYbE/8mGxP/JhsS/ycaEf8nGRD/JxoR/yUdFv8hJSH/GDEx/xE+
RP8OTlf/E11p/yVveP8/gYf/XJOV/3Ojo/+AsK//grq6/37BxP94yM3/dM7W/3bW3v983ub/g+bt/4ns
8/+O8fb/kPP4/5Hz9/+R8fb/kPD0/43u8/+K7fL/huzy/4Dr8f966fD/c+bv/2rj7v9h3+3/WNzs/1DZ
6/9K1+r/RdXq/0HT6f880en/Ns/n/y7M5v8nyeP/H8Xh/xfC3/8Rv93/DL3b/wi72v8Eudn/AbjY/wC4
2P8Audn/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC5
2f8AuNj/ArjY/we62v8Ovdz/FcHe/xzE4P8jx+L/KMnk/yzL5f8xzeb/Ns/o/z3S6f9F1er/Tdjr/1bb
7P9d3u3/Y+Dt/2nj7v9u5e//dOfw/3vp8P+D6/H/i+7y/5Pw9P+Z8vX/nfT3/6D3+f+h+fz/n/n8/5n1
+f+M7PL/et/o/2bQ2/9WwM3/TrK//1CmsP9XmqD/X4+P/2KDgf9bd3T/TGtq/zpfYP8oVFf/G0hN/xc+
Qf8YMzP/HSkm/yEhG/8kGxP/JRkQ/yUYD/8lGRD/JRoR/yUaEf8lGhL/JRoS/yUaEv8lGhL/JRoS/yUa
Ev8lGhL/JRoS/yUaEv8lGhL/JRoS/yUaEv8lGhH/JRoR/yUZEP8lGA//JRkQ/yQbE/8hIRv/HSkm/xgz
M/8XPkH/G0hN/yhUV/86X2D/TGtq/1t3dP9ig4H/X4+P/1eaoP9QprD/TrK//1bAzf9m0Nv/et/o/4zs
8v+Z9fn/n/n8/6H5/P+g9/n/nfT3/5ny9f+T8PT/i+7y/4Pr8f976fD/dOfw/27l7/9p4+7/Y+Dt/13e
7f9W2+z/Tdjr/0XV6v890un/Ns/o/zHN5v8sy+X/KMnk/yPH4v8cxOD/FcHe/w693P8Hutr/ArjY/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC5
2f8AuNj/A7nZ/wq82/8TwN3/HsXg/yfJ4/8ty+X/MM3m/zLO5/80zuf/ONDo/0DT6f9K1+r/Vtvs/2Hf
7f9p4u7/buTv/3Hm7/9z5u//dufw/3zp8f+F7PL/j+/z/5ry9f+i9Pb/p/b3/6v5+v+t+/v/qvn7/6Dz
9v+M5uv/b9Pd/1G+zP84qbr/K5an/yuFkv8zdXz/PmZn/0VZVv9FT0n/P0dC/zZCPv8tPTr/Jzg2/yUz
Mf8lLir/Jyok/yomH/8rIxv/LCIZ/ywiGf8sIhr/KyIa/ysiGv8rIhr/LCIa/ywiGv8sIhr/LCMa/ywj
Gv8sIxr/LCMa/ywiGv8sIhr/LCIa/ysiGv8rIhr/KyIa/ywiGv8sIhn/LCIZ/ysjG/8qJh//Jyok/yUu
Kv8lMzH/Jzg2/y09Ov82Qj7/P0dC/0VPSf9FWVb/PmZn/zN1fP8rhZL/K5an/zipuv9Rvsz/b9Pd/4zm
6/+g8/b/qvn7/637+/+r+fr/p/b3/6L09v+a8vX/j+/z/4Xs8v986fH/dufw/3Pm7/9x5u//buTv/2ni
7v9h3+3/Vtvs/0rX6v9A0+n/ONDo/zTO5/8yzuf/MM3m/y3L5f8nyeP/HsXg/xPA3f8KvNv/A7nZ/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Cudn/Brva/w++3P8Zw9//Jcji/y7M5f81z+f/N9Do/zjQ6P850ej/PdLp/0XV6v9Q2ev/Xd7t/2ni
7v9y5u//d+fw/3jo8P956PD/e+nw/4Dq8f+I7fP/k/D0/53z9v+l9fb/qvX2/6719f+u9PP/qu/v/57m
5/+G1tv/ZcHK/0GpuP8kkqP/FH2P/xNqeP8cV1//KEhJ/zI7Nv82Myz/Ni8n/zQvJ/8yLyn/MTAq/zIx
K/81Miv/ODMs/zo0Lf88NS3/PTUt/z01Lf88NS3/PDUt/zw1Lf88NS3/PDQt/zw0Lf87NC3/OzQt/zs0
Lf87NC3/OzQt/zs0Lf88NC3/PDQt/zw1Lf88NS3/PDUt/zw1Lf89NS3/PTUt/zw1Lf86NC3/ODMs/zUy
K/8yMSv/MTAq/zIvKf80Lyf/Ni8n/zYzLP8yOzb/KEhJ/xxXX/8Tanj/FH2P/ySSo/9Bqbj/ZcHK/4bW
2/+e5uf/qu/v/6708/+u9fX/qvX2/6X19v+d8/b/k/D0/4jt8/+A6vH/e+nw/3no8P946PD/d+fw/3Lm
7/9p4u7/Xd7t/1DZ6/9F1er/PdLp/znR6P840Oj/N9Do/zXP5/8uzOX/Jcji/xnD3/8Pvtz/Brva/wK5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anbr/AKrI/wC00/8Cudn/A7vb/wa8
2/8JvNv/Dr7c/xbC3v8gxuH/Ksrk/zPO5/850ej/PdLp/z/T6f9C1On/RtXq/07Y6/9Y3Oz/Y+Dt/27k
7/935/D/fOnw/3/q8f+B6/H/g+vy/4jt8/+O8PX/lvP3/531+P+i9ff/pPHy/6Xr6/+j4uH/nNfW/4/J
yf94uLv/WaSr/ziPmv8deoj/Dmd1/wxUYP8TQ0n/HTQ0/ycpJP8tJBz/MCMb/zMmHv82KyT/OjEq/0A4
Mf9IQDn/UElC/1dQSf9bVU7/XVdR/15XUf9dV1H/XFZQ/1xWUP9bVk//W1VP/1pVT/9ZVU7/WVRO/1lU
Tv9ZVE7/WVRO/1lVTv9aVU//W1VP/1tWT/9cVlD/XFZQ/11XUf9eV1H/XVdR/1tVTv9XUEn/UElC/0hA
Of9AODH/OjEq/zYrJP8zJh7/MCMb/y0kHP8nKST/HTQ0/xNDSf8MVGD/Dmd1/x16iP84j5r/WaSr/3i4
u/+Pycn/nNfW/6Pi4f+l6+v/pPHy/6L19/+d9fj/lvP3/47w9f+I7fP/g+vy/4Hr8f9/6vH/fOnw/3fn
8P9u5O//Y+Dt/1jc7P9O2Ov/RtXq/0LU6f8/0+n/PdLp/znR6P8zzuf/Ksrk/yDG4f8Wwt7/Dr7c/wm8
2/8GvNv/A7vb/wK52f8AtNP/AKrI/wCduv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbr/AKrI/wG00/8Eutn/CL3d/w2/
3v8Twd7/GcPf/yDG4f8nyeP/L8zl/zbP5/880un/QtTq/0fW6v9M2Ov/Utrr/1nc7P9h3+3/aePu/3Hm
7/946PD/f+rx/4Ts8v+K7fL/ju7z/5Lw9P+W8/j/mff7/5v4/P+b9fj/mOvu/5Tc3P+OyMf/hLSx/3eh
nv9kkI//TH+C/zJvdf8eYGj/ElFa/xBCSP8UNDb/Gygm/yMgGv8oHhb/LiAY/zMmHv86Lyj/Qzo0/1BH
Qf9fWFL/b2lk/314c/+Hgn3/i4aC/4yHg/+LhoH/iYSA/4iEf/+Hg3//hYJ+/4SCff+DgX3/goF8/4KB
fP+CgXz/goF8/4OBff+Egn3/hYJ+/4eDf/+IhH//iYSA/4uGgf+Mh4P/i4aC/4eCff99eHP/b2lk/19Y
Uv9QR0H/Qzo0/zovKP8zJh7/LiAY/ygeFv8jIBr/Gygm/xQ0Nv8QQkj/ElFa/x5gaP8yb3X/TH+C/2SQ
j/93oZ7/hLSx/47Ix/+U3Nz/mOvu/5v1+P+b+Pz/mff7/5bz+P+S8PT/ju7z/4rt8v+E7PL/f+rx/3jo
8P9x5u//aePu/2Hf7f9Z3Oz/Utrr/0zY6/9H1ur/QtTq/zzS6f82z+f/L8zl/yfJ4/8gxuH/GcPf/xPB
3v8Nv97/CL3d/wS62f8BtNP/AKrI/wCduv8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbn/AKrI/wG00/8Gu9r/DcDe/xXD
4P8exeH/JMji/yrK5P8uzOX/Ms7n/zfQ6P890un/RdXq/07Y6/9X3Oz/X9/t/2Xh7v9q4+7/b+Xv/3Pm
7/956PD/gevx/4rt8v+S7/T/mfH1/5zz9v+c9vr/mvn9/5b4/f+Q8fb/iOHl/3/Iyv91qqn/aY2K/111
cf9PZWH/P1lX/zBQUP8kSEr/HT9B/xo1Nv8cLCr/ICQf/yUgGf8qIRn/MCUe/zcuKP9BOTT/TkhE/2Fb
WP95dHH/kY2K/6ajoP+1sq//u7i2/726t/+7uLX/ubaz/7e1sv+1tLH/s7Ow/7Gyr/+vsa7/rrCu/62w
rf+tsK3/rrCu/6+xrv+xsq//s7Ow/7W0sf+3tbL/ubaz/7u4tf+9urf/u7i2/7Wyr/+mo6D/kY2K/3l0
cf9hW1j/TkhE/0E5NP83Lij/MCUe/yohGf8lIBn/ICQf/xwsKv8aNTb/HT9B/yRISv8wUFD/P1lX/09l
Yf9ddXH/aY2K/3Wqqf9/yMr/iOHl/5Dx9v+W+P3/mvn9/5z2+v+c8/b/mfH1/5Lv9P+K7fL/gevx/3no
8P9z5u//b+Xv/2rj7v9l4e7/X9/t/1fc7P9O2Ov/RdXq/z3S6f830Oj/Ms7n/y7M5f8qyuT/JMji/x7F
4f8Vw+D/DcDe/wa72v8BtNP/AKrI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbn/AKnI/wK00/8IvNv/EsHf/xzG
4v8nyeT/Lszl/zLN5v80zuf/Nc/n/zjQ6P8+0un/SNbq/1Tb7P9g3+3/auPu/3Dl7/9z5u//dOfw/3bn
8P976fD/g+vy/47u8/+Z8fX/ofT2/6P09v+f9vn/mPb6/47y+P+D6O7/eNLX/2uytP9djYz/UGpm/0VP
Sf89QDr/NTk0/zA3Mv8sNjL/KTQw/ykvK/8pLCb/LCki/y8pIv81LSb/OjMt/0I9OP9NSkf/XVpZ/3Ry
cf+RkI//sK6t/8rJyP/c29r/5OPi/+bl4//k4+H/4eDf/9/f3v/d3tz/2tzb/9fb2v/V2tn/1NnY/9PZ
2P/T2dj/1NnY/9Xa2f/X29r/2tzb/93e3P/f397/4eDf/+Tj4f/m5eP/5OPi/9zb2v/Kycj/sK6t/5GQ
j/90cnH/XVpZ/01KR/9CPTj/OjMt/zUtJv8vKSL/LCki/yksJv8pLyv/KTQw/yw2Mv8wNzL/NTk0/z1A
Ov9FT0n/UGpm/12NjP9rsrT/eNLX/4Po7v+O8vj/mPb6/5/2+f+j9Pb/ofT2/5nx9f+O7vP/g+vy/3vp
8P925/D/dOfw/3Pm7/9w5e//auPu/2Df7f9U2+z/SNbq/z7S6f840Oj/Nc/n/zTO5/8yzeb/Lszl/yfJ
5P8cxuL/EsHf/wi82/8CtNP/AKnI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8JvNv/FMPg/yHI
4/8szOX/NM7n/zfQ6P830Oj/N9Do/zjQ6P8/0un/Stfq/1jc7P9m4e7/ceXv/3jo8P966fD/e+nw/3zp
8f+A6vH/iO3z/5Lw9P+c8/b/o/T2/6Pz9f+c8fP/kezw/4Tk6f921dr/ab3B/1uanP9MdHL/QFBM/zc3
MP8yKiP/MCcg/zEqIv8zLif/NTAq/zcyK/86NC3/Pjgx/0M9Nv9JQz3/T0pF/1dUUP9hYF7/cXFw/4iJ
if+mp6f/xsfH/+Li4v/09fT//P39//7//v/8/Pz/+fr5//f5+P/19/f/8vb2/+/19P/t9PP/6/Pz/+vz
8//r8/P/6/Pz/+308//v9fT/8vb2//X39//3+fj/+fr5//z8/P/+//7//P39//T19P/i4uL/xsfH/6an
p/+IiYn/cXFw/2FgXv9XVFD/T0pF/0lDPf9DPTb/Pjgx/zo0Lf83Miv/NTAq/zMuJ/8xKiL/MCcg/zIq
I/83NzD/QFBM/0x0cv9bmpz/ab3B/3bV2v+E5On/kezw/5zx8/+j8/X/o/T2/5zz9v+S8PT/iO3z/4Dq
8f986fH/e+nw/3rp8P946PD/ceXv/2bh7v9Y3Oz/Stfq/z/S6f840Oj/N9Do/zfQ6P830Oj/NM7n/yzM
5f8hyOP/FMPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8Kvdv/FcPg/yPI
5P8vzeb/N8/o/znR6f840On/N9Do/zjQ6P8+0un/Stfq/1nc7P9o4u7/dOfw/3zp8f+A6/H/g+vx/4Xs
8v+I7fP/jvD1/5bz+P+c9vr/n/b5/5zx8/+T5+r/htre/3fKzv9otrn/Wp2f/01+ff9AXVn/Nj85/zAr
I/8tIhn/LyEZ/zMnH/85Lif/QDYv/0g/OP9SSUP/XFRO/2VfWf9taGP/c3Bs/3h3df+AgYD/jI6O/6Ci
ov+5u7z/1NXV/+vs7P/7+/v///////////////////////7////8////+v7///j+/v/2/v7/9f7+//X+
/v/1/v7/9f7+//b+/v/4/v7/+v7///z////+//////////////////////////v7+//r7Oz/1NXV/7m7
vP+goqL/jI6O/4CBgP94d3X/c3Bs/21oY/9lX1n/XFRO/1JJQ/9IPzj/QDYv/zkuJ/8zJx//LyEZ/y0i
Gf8wKyP/Nj85/0BdWf9Nfn3/Wp2f/2i2uf93ys7/htre/5Pn6v+c8fP/n/b5/5z2+v+W8/j/jvD1/4jt
8/+F7PL/g+vx/4Dr8f986fH/dOfw/2ji7v9Z3Oz/Stfq/z7S6f840Oj/N9Do/zjQ6f850en/N8/o/y/N
5v8jyOT/FcPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8Kvdv/FsPg/yPJ
5P8vzeb/N9Do/znR6f840On/Ns/o/zfQ6P890un/Sdbq/1jc7P9n4u7/defw/37q8f+G7PL/i+7y/4/v
8/+T8PT/lvP3/5n3+/+a+f3/mPb6/5Hs8P+G2t7/d8PG/2epq/9YkJD/THh3/0FfXP84R0L/MTMt/y4n
H/8uIhr/MSQd/zcsJf9ANjH/S0M+/1tTTv9tZ2L/gHp2/4+Lh/+al5P/n52b/6Giof+lqKf/rLCw/7q+
vv/Mz9D/4OLi//Hy8v/8/Pz///////////////////////7////8////+v////n////3////9/////b/
///2////9/////f////5////+v////z////+//////////////////////////z8/P/x8vL/4OLi/8zP
0P+6vr7/rLCw/6Wop/+hoqH/n52b/5qXk/+Pi4f/gHp2/21nYv9bU07/S0M+/0A2Mf83LCX/MSQd/y4i
Gv8uJx//MTMt/zhHQv9BX1z/THh3/1iQkP9nqav/d8PG/4ba3v+R7PD/mPb6/5r5/f+Z9/v/lvP3/5Pw
9P+P7/P/i+7y/4bs8v9+6vH/defw/2fi7v9Y3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6f850en/N9Do/y/N
5v8jyeT/FsPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8KvNv/FcPg/yLI
5P8uzOb/Ns/o/znQ6P840Oj/Ns/o/zfQ6P890un/Sdbq/1fc7P9m4e7/dOfw/4Dq8f+K7fL/k/D0/5ry
9f+d8/b/nfX4/5v4/P+W+P3/jvL4/4Tk6f93ys7/Z6mr/1eIh/9Jamf/P1RQ/zhDPf8yNS//MC0l/y8o
IP8yKCH/Ni0n/z43Mv9JRED/WVRR/3Braf+KhoT/pKGf/7q3tf/GxMP/ysrJ/8rMy//Jzc3/y9DQ/9LY
2P/c4uL/5+3t//D29v/2/Pz/+f////r////5////+P7+//f+/v/3/f3/9v39//X8/P/0/Pz/8/z8//P8
/P/z/Pz/8/z8//T8/P/1/Pz/9v39//f9/f/3/v7/+P7+//n////6////+f////b8/P/w9vb/5+3t/9zi
4v/S2Nj/y9DQ/8nNzf/KzMv/ysrJ/8bEw/+6t7X/pKGf/4qGhP9wa2n/WVRR/0lEQP8+NzL/Ni0n/zIo
If8vKCD/MC0l/zI1L/84Qz3/P1RQ/0lqZ/9XiIf/Z6mr/3fKzv+E5On/jvL4/5b4/f+b+Pz/nfX4/53z
9v+a8vX/k/D0/4rt8v+A6vH/dOfw/2bh7v9X3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6P850Oj/Ns/o/y7M
5v8iyOT/FcPg/wq82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8JvNv/FcPg/yLI
4/8tzOb/Ns/n/znQ6P850Oj/ONDo/zrR6P9A0+n/S9fq/1jc7P9m4e7/dObw/4Dq8f+N7vP/mfL1/6L0
9v+l9fb/ovX3/5v1+P+Q8fb/g+ju/3bV2v9otrn/WJCQ/0lqZ/8+S0b/Njgx/zEuJv8wKSL/MSoi/zQt
Jf85Miv/Pzo1/0lGQv9XVVP/amlo/4WEhP+kpKP/w8LC/9vb2v/o6ej/7O7t/+rt7f/l6+v/4+rq/+Xs
7P/o7/D/7PPz/+/29v/x+Pn/8vn5//L6+v/y+fn/8vn5//L5+f/x+fn/8fn5//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8fn5//H5+f/y+fn/8vn5//L5+f/y+vr/8vn5//H4+f/v9vb/7PPz/+jv
8P/l7Oz/4+rq/+Xr6//q7e3/7O7t/+jp6P/b29r/w8LC/6Sko/+FhIT/amlo/1dVU/9JRkL/Pzo1/zky
K/80LSX/MSoi/zApIv8xLib/Njgx/z5LRv9Jamf/WJCQ/2i2uf921dr/g+ju/5Dx9v+b9fj/ovX3/6X1
9v+i9Pb/mfL1/43u8/+A6vH/dObw/2bh7v9Y3Oz/S9fq/0DT6f860ej/ONDo/znQ6P850Oj/Ns/n/y3M
5v8iyOP/FcPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnH/wK00/8JvNv/FcPg/yHI
4/8tzOb/Ns/n/zvR6f880un/PtLp/0HT6f9H1ur/UNnr/1ze7P9o4u7/dOfw/4Hr8v+Q8PT/nfT3/6f2
9/+q9fb/pPHy/5jr7v+I4eX/eNLX/2m9wf9anZ//THh3/z9UUP82ODH/MCkh/y4jG/8vJRz/Myoj/zkz
LP9CPDf/TElF/1pYVv9ra2r/f4CA/5ucnP+6u7v/19jY/+7v7//6/Pz//f////r////1+/v/8fj4//D4
+P/v+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4/+/4
+P/w+Pj/8fj4//X7+//6/////f////r8/P/u7+//19jY/7q7u/+bnJz/f4CA/2trav9aWFb/TElF/0I8
N/85Myz/Myoj/y8lHP8uIxv/MCkh/zY4Mf8/VFD/THh3/1qdn/9pvcH/eNLX/4jh5f+Y6+7/pPHy/6r1
9v+n9vf/nfT3/5Dw9P+B6/L/dOfw/2ji7v9c3uz/UNnr/0fW6v9B0+n/PtLp/zzS6f870en/Ns/n/y3M
5v8hyOP/FcPg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wK00/8JvNv/FMLg/yHH
4/8tzOX/N8/n/z7S6f9C1Or/R9bq/0vX6v9S2uv/Wd3s/2Hg7f9r4+7/defw/4Hr8v+R8fb/oPf5/6v5
+v+u9fX/pevr/5Tc3P9/yMr/a7K0/1uanP9Nfn3/QV9c/zhDPf8xLib/LiMb/y4hGf8xJh//Ny8p/0A7
Nv9NSkb/Xlxa/3FxcP+Fh4f/mp2d/7K0tf/LzM3/4uPj//P09P/9/v7///////3////5////9f39//T8
/P/y+/v/8fr6//D5+f/w+Pj/7/j4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/7/j4//D4+P/w+fn/8fr6//L7
+//0/Pz/9f39//n////9//////////3+/v/z9PT/4uPj/8vMzf+ytLX/mp2d/4WHh/9xcXD/Xlxa/01K
Rv9AOzb/Ny8p/zEmH/8uIRn/LiMb/zEuJv84Qz3/QV9c/01+ff9bmpz/a7K0/3/Iyv+U3Nz/pevr/671
9f+r+fr/oPf5/5Hx9v+B6/L/defw/2vj7v9h4O3/Wd3s/1La6/9L1+r/R9bq/0LU6v8+0un/N8/n/y3M
5f8hx+P/FMLg/wm82/8CtNP/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wKz0/8JvNv/FMLg/yDH
4/8tzOX/ONDo/0HT6f9J1+v/Udnr/1jc7P9f3u3/ZOHt/2ni7v9u5e//dufw/4Hs8v+R8/f/ofn8/637
+/+u9PP/o+Lh/47Ix/91qqn/XY2M/0x0cv9AXVn/OEdC/zI1L/8wKSL/LyUc/zEmH/82LSf/Pjgz/0pH
Q/9cWlj/cnNx/4uNjP+jpqb/t7y8/8rOz//b39//6u3t//X4+P/7/v7//f////v////3/v7/9f39//P8
/P/y+/v/8fr6//D5+f/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+fn/8fr6//L7
+//z/Pz/9f39//f+/v/7/////f////v+/v/1+Pj/6u3t/9vf3//Kzs//t7y8/6Ompv+LjYz/cnNx/1xa
WP9KR0P/Pjgz/zYtJ/8xJh//LyUc/zApIv8yNS//OEdC/0BdWf9MdHL/XY2M/3Wqqf+OyMf/o+Lh/670
8/+t+/v/ofn8/5Hz9/+B7PL/dufw/27l7/9p4u7/ZOHt/1/e7f9Y3Oz/Udnr/0nX6/9B0+n/ONDo/y3M
5f8gx+P/FMLg/wm82/8Cs9P/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8Anbn/AKnH/wK00/8JvNv/E8Lg/yDH
4/8tzOX/OdDo/0TV6v9Q2ev/W93t/2Tg7v9r4+7/buTv/3Dl7/9z5u//eOjw/4Hs8/+Q8/j/n/n8/6r5
+/+q7+//nNfW/4S0sf9pjYr/UGpm/0BQTP82Pzn/MTMt/zAtJf8xKiL/Myoj/zcvKf8+ODP/SUVC/1hW
VP9tbWz/iIqJ/6Sop/++w8P/0djY/9/l5f/o7u//7vT1//L4+f/1/Pz/9v39//X8/P/z+/v/8vr6//H5
+f/x+fn/8Pn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pn5//H5
+f/x+fn/8vr6//P7+//1/Pz/9v39//X8/P/y+Pn/7vT1/+ju7//f5eX/0djY/77Dw/+kqKf/iIqJ/21t
bP9YVlT/SUVC/z44M/83Lyn/Myoj/zEqIv8wLSX/MTMt/zY/Of9AUEz/UGpm/2mNiv+EtLH/nNfW/6rv
7/+q+fv/n/n8/5Dz+P+B7PP/eOjw/3Pm7/9w5e//buTv/2vj7v9k4O7/W93t/1DZ6/9E1er/OdDo/y3M
5f8gx+P/E8Lg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRq/8Anbr/AarI/wS11P8Lvdz/FcPh/yHI
5P8tzOb/OtDo/0fW6v9U2+z/YeDt/2zk7/905u//d+jw/3jo8P956PD/fOnw/4Pr8v+O8fb/mfX5/6Dz
9v+e5uf/j8nJ/3ehnv9ddXH/RU9J/zc3MP8wKyP/Licf/y8oIP80LSX/OTMs/0A7Nv9KR0P/WFZU/2lo
aP+AgYH/nKCg/7q/v//T2tr/5ezs/+719f/x+Pn/8fj4//D4+P/x+Pj/8fn5//H4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+Pj/8fn5//H4+P/w+Pj/8fj4//H4+f/u9fX/5ezs/9Pa2v+6v7//nKCg/4CB
gf9paGj/WFZU/0pHQ/9AOzb/OTMs/zQtJf8vKCD/Licf/zArI/83NzD/RU9J/111cf93oZ7/j8nJ/57m
5/+g8/b/mfX5/47x9v+D6/L/fOnw/3no8P946PD/d+jw/3Tm7/9s5O//YeDt/1Tb7P9H1ur/OtDo/y3M
5v8hyOT/FcPh/wu93P8EtdT/AarI/wCduv8Akav/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AYeg/wOSrP8EoLv/B63K/wy51v8SwN7/GsXi/yTJ
5P8uzOb/OtDo/0fW6v9W2+z/ZOHu/3Dl7/956PD/furx/4Dr8v+B6/L/g+vx/4Xr8f+J7PP/jOzy/4zm
6/+G1tv/eLi7/2SQj/9PZWH/PUA6/zIqI/8tIhn/LiIa/zIoIf85Miv/Qjw3/01KRv9cWlj/bW1s/4CB
gf+Wmpr/sbW2/8vR0f/g6Oj/7/f3//X9/f/1/f3/8/v7//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/x+fn/8fn5//L6+v/y+vr/8vr6//L6+v/y+vr/8vr6//L6
+v/y+vr/8vr6//L6+v/y+vr/8vr6//L6+v/y+vr/8fn5//H5+f/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8/v7//X9/f/1/f3/7/f3/+Do6P/L0dH/sbW2/5aa
mv+AgYH/bW1s/1xaWP9NSkb/Qjw3/zkyK/8yKCH/LiIa/y0iGf8yKiP/PUA6/09lYf9kkI//eLi7/4bW
2/+M5uv/jOzy/4ns8/+F6/H/g+vx/4Hr8v+A6/L/furx/3no8P9w5e//ZOHu/1bb7P9H1ur/OtDo/y7M
5v8kyeT/GsXi/xLA3v8Mudb/B63K/wSgu/8Dkqz/AYeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/A4ig/waUrf8Lor3/EbHN/xa92f8cxOH/Isnk/yjL
5v8wzef/OdDo/0bV6v9V2+z/ZOHu/3Hl7/976fH/g+zy/4nu8/+M7/T/jO3y/4nq8P+D5u3/et/o/2/T
3f9lwcr/WaSr/0x/gv8/WVf/NTk0/zAnIP8vIRn/MSQd/zYtJ/8/OjX/TElF/15cWf9ycnH/iIqJ/5yg
oP+xtbb/xcvL/9jf3//o8PD/8vr6//b+/v/2/v7/8/v7//D5+f/w+Pj/7/j4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//L6+v/z+/v/9Pz8//T9/f/1/f3/9f7+//X+/v/2/v7/9v7///b+
///2/v//9v7///b+/v/1/v7/9f7+//X9/f/0/f3/9Pz8//P7+//y+vr/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4//D4+P/w+fn/8/v7//b+/v/2/v7/8vr6/+jw8P/Y39//xcvL/7G1
tv+coKD/iIqJ/3Jycf9eXFn/TElF/z86Nf82LSf/MSQd/y8hGf8wJyD/NTk0/z9ZV/9Mf4L/WaSr/2XB
yv9v093/et/o/4Pm7f+J6vD/jO3y/4zv9P+J7vP/g+zy/3vp8f9x5e//ZOHu/1Xb7P9G1er/OdDo/zDN
5/8oy+b/Isnk/xzE4f8Wvdn/EbHN/wuivf8GlK3/A4ig/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/BIih/wuVrv8Spb//G7XQ/yLC3P8nyeT/Kszn/y3N
5/8yzuf/OdDo/0XV6v9T2uz/Y+Dt/3Hl7/986fH/h+7z/5Hx9f+X8vX/lu/z/43o7v983ub/ZtDb/1G+
zP9Bqbj/OI+a/zJvdf8wUFD/MDcy/zEqIv8zJx//Nywl/z43Mv9JRkL/WlhW/3Fxb/+LjYz/pKin/7q/
v//L0dH/2N/f/+Tr6//s9PT/8vr6//T8/P/0/Pz/8vr6//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/7/j4//D4+P/w+Pj/8fn5//L6+v/z/Pz/9P39//X9/f/2/v7/9v7+//b////3////9/////f/
///3////9/////f////2////9v7+//b+/v/1/f3/9P39//P8/P/y+vr/8fn5//D4+P/w+Pj/7/j4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vr6//T8/P/0/Pz/8vr6/+z09P/k6+v/2N/f/8vR
0f+6v7//pKin/4uNjP9xcW//WlhW/0lGQv8+NzL/Nywl/zMnH/8xKiL/MDcy/zBQUP8yb3X/OI+a/0Gp
uP9Rvsz/ZtDb/3ze5v+N6O7/lu/z/5fy9f+R8fX/h+7z/3zp8f9x5e//Y+Dt/1Pa7P9F1er/OdDo/zLO
5/8tzef/Kszn/yfJ5P8iwtz/G7XQ/xKlv/8Lla7/BIih/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/BYmh/w6Xr/8ZqMH/I7nS/yzG3/8wzeb/MtDp/zPQ
6f820Oj/PNHo/0bV6v9T2uv/YuDt/3Dl7/996fH/i+/0/5jz9/+g9ff/n/L0/5Hn6/921t7/VsDN/zip
uv8kkqP/HXqI/x5gaP8kSEr/LDYy/zMuJ/85Lif/QDYx/0lEQP9XVVP/a2tq/4WHh/+jpqb/vsPD/9Pa
2v/g6Oj/6PDw/+z09P/u9vb/8Pj4//H5+f/x+fn/8fn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+fn/8fn5//H5+f/x+fn/8fn5//H5
+f/x+fn/8fn5//H5+f/x+fn/8fn5//D5+f/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//H5+f/x+fn/8Pj4/+729v/s9PT/6PDw/+Do
6P/T2tr/vsPD/6Ompv+Fh4f/a2tq/1dVU/9JRED/QDYx/zkuJ/8zLif/LDYy/yRISv8eYGj/HXqI/ySS
o/84qbr/VsDN/3bW3v+R5+v/n/L0/6D19/+Y8/f/i+/0/33p8f9w5e//YuDt/1Pa6/9G1er/PNHo/zbQ
6P8z0On/MtDp/zDN5v8sxt//I7nS/xmowf8Ol6//BYmh/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8AgZn/Bomh/xCYsP8dqsL/KbvU/zLJ4f840Oj/OdPr/zrT
6v880un/QdPp/0rX6v9W2+z/Y+Dt/3Dl7/996vH/jfD1/5z1+P+m9/n/pfP0/5Xl6P90ztb/TrK//yuW
p/8UfY//Dmd1/xJRWv8dP0H/KTQw/zUwKv9ANi//S0M+/1lUUf9qaWj/f4CA/5udnf+3vLz/0djY/+Xs
7P/v9/f/8vr6//L6+v/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+fn/8fn5//H5+f/w+Pj/7vX1/+vy8v/o7+//5ezs/+Pq6v/h6Oj/4Ofn/+Dm5v/f5uX/3+Xl/9/l
5P/f5eT/3+Xl/9/m5f/g5ub/4Ofn/+Ho6P/j6ur/5ezs/+jv7//r8vL/7vX1//D4+P/x+fn/8fn5//H5
+f/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/y+vr/8vr6/+/3
9//l7Oz/0djY/7e8vP+bnZ3/f4CA/2ppaP9ZVFH/S0M+/0A2L/81MCr/KTQw/x0/Qf8SUVr/Dmd1/xR9
j/8rlqf/TrK//3TO1v+V5ej/pfP0/6b3+f+c9fj/jfD1/33q8f9w5e//Y+Dt/1bb7P9K1+r/QdPp/zzS
6f860+r/OdPr/zjQ6P8yyeH/KbvU/x2qwv8QmLD/Bomh/wCBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xGYsP8eqsL/K7zU/zXK4v880un/QNXs/0PW
7P9G1ur/S9fq/1Pa6/9c3uz/ZuHu/3Hl7/996vH/jvH2/573+v+q+vv/qvX1/5nk5v94yM3/UKaw/yuF
kv8Tanj/DFRg/xBCSP8aNTb/KS8r/zcyK/9IPzj/W1NO/3Braf+FhIT/m5yc/7O2tv/Kz9D/3+Xl/+71
9f/1/f3/9v7+//T8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//L5
+f/0+/v/9v39//b9/f/0+vr/7fPz/+Pp6f/Z39//0NbW/8rPz//Fysr/wsfG/8DEw/++wsD/vcG//73A
vv+9wL7/vcG//77CwP/AxMP/wsfG/8XKyv/Kz8//0NbW/9nf3//j6en/7fPz//T6+v/2/f3/9v39//T7
+//y+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/0/Pz/9v7+//X9
/f/u9fX/3+Xl/8rP0P+ztrb/m5yc/4WEhP9wa2n/W1NO/0g/OP83Miv/KS8r/xo1Nv8QQkj/DFRg/xNq
eP8rhZL/UKaw/3jIzf+Z5Ob/qvX1/6r6+/+e9/r/jvH2/33q8f9x5e//ZuHu/1ze7P9T2uv/S9fq/0bW
6v9D1uz/QNXs/zzS6f81yuL/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xGYsP8eqsL/K7zU/zbL4v8/0+r/Rtft/0zZ
7f9S2uz/WNzs/17e7f9k4e3/auPu/3Lm7/996vH/jfH2/5/5/P+s/P3/rfb2/57i4/9+wcT/V5qg/zN1
fP8cV1//E0NJ/xQ0Nv8cLCr/KSwm/zo0Lf9SSUP/bWdi/4qGhP+kpKP/uru7/8zP0P/b4OH/6O7v//H4
+P/1/f3/9v7+//T8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//P6
+v/4/f3//P////z+/v/3+Pj/6uzs/9nb2//Gycn/tbm5/6mtrf+hpKP/m56c/5iZlv+VlZL/kpKP/5GR
jf+RkY3/kpKP/5WVkv+YmZb/m56c/6Gko/+pra3/tbm5/8bJyf/Z29v/6uzs//f4+P/8/v7//P////j9
/f/z+vr/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/0/Pz/9v7+//X9
/f/x+Pj/6O7v/9vg4f/Mz9D/uru7/6Sko/+KhoT/bWdi/1JJQ/86NC3/KSwm/xwsKv8UNDb/E0NJ/xxX
X/8zdXz/V5qg/37BxP+e4uP/rfb2/6z8/f+f+fz/jfH2/33q8f9y5u//auPu/2Th7f9e3u3/WNzs/1La
7P9M2e3/Rtft/z/T6v82y+L/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xCYsP8dqsL/KrzU/zbK4v9B1Or/S9nt/1Xd
7v9d3+3/ZeHu/2nj7v9s5O7/cOXv/3Xn8P996vH/jPH3/535/P+q/P3/rPX1/5/f3v+Curr/X4+P/z5m
Z/8oSEn/HTQ0/xsoJv8gJB//LCki/z44Mf9cVE7/gHp2/6Shn//DwsL/19jY/+Pm5//q7+//7vT1//H4
+P/z+/v/8/v7//L6+v/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//T6
+v/5/v7//f////3////19vb/4+Pk/8rLzP+wsbL/mJqa/4iJif98fXv/dHNw/25saP9qZ2L/Z2Ne/2Vi
XP9lYlz/Z2Ne/2pnYv9ubGj/dHNw/3x9e/+IiYn/mJqa/7Cxsv/Ky8z/4+Pk//X29v/9/////f////n+
/v/0+vr/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/y+vr/8/v7//P7
+//x+Pj/7vT1/+rv7//j5uf/19jY/8PCwv+koZ//gHp2/1xUTv8+ODH/LCki/yAkH/8bKCb/HTQ0/yhI
Sf8+Zmf/X4+P/4K6uv+f397/rPX1/6r8/f+d+fz/jPH3/33q8f915/D/cOXv/2zk7v9p4+7/ZeHu/13f
7f9V3e7/S9nt/0HU6v82yuL/KrzU/x2qwv8QmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8cqsL/KbvU/zXK4v9C1Or/T9vt/1zf
7/9n4u//b+Xv/3Pm7/915/D/dufw/3jo8P9/6vH/i/D2/5n2+v+j+Pr/pe/w/5nX1/+AsK//YoOB/0VZ
Vv8yOzb/Jykk/yMgGv8lIBn/Lyki/0M9Nv9lX1n/j4uH/7q3tf/b29r/7u/v//X4+f/1+vr/8vj5//D4
+P/w+Pj/8Pn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//P6
+v/4/f3/+/7+//n7+//u7+//2NjY/7q7u/+am5v/fn9//2tqaf9dW1n/U1BM/01IQv9IQjv/RD02/0I7
NP9COzT/RD02/0hCO/9NSEL/U1BM/11bWf9ramn/fn9//5qbm/+6u7v/2NjY/+7v7//5+/v/+/7+//j9
/f/z+vr/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pn5//D4
+P/w+Pj/8vj5//X6+v/1+Pn/7u/v/9vb2v+6t7X/j4uH/2VfWf9DPTb/Lyki/yUgGf8jIBr/Jykk/zI7
Nv9FWVb/YoOB/4Cwr/+Z19f/pe/w/6P4+v+Z9vr/i/D2/3/q8f946PD/dufw/3Xn8P9z5u//b+Xv/2fi
7/9c3+//T9vt/0LU6v81yuL/KbvU/xyqwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Udzu/2Dh
7/9s5O//defw/3rp8P996vH/furx/3/q8f+C6vH/ie3z/5Dw9f+U7vL/k+Pm/4jKzP9zo6P/W3d0/0VP
Sf82Myz/LSQc/ygeFv8qIRn/NS0m/0lDPf9taGP/mpaT/8bEw//o6ej/+vz8///////7////9fz8//H4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//L6+v/z+vr/8vn5//H3
9v/x9PT/7vDv/+bn5v/Y19b/wcC//6Oiof+Eg4L/aWhn/1ZUUv9IRUL/Pzo1/zgyK/8zLCT/Lycf/y0l
HP8tJRz/Lycf/zMsJP84Miv/Pzo1/0hFQv9WVFL/aWhn/4SDgv+joqH/wcC//9jX1v/m5+b/7vDv//H0
9P/x9/b/8vn5//P6+v/y+vr/8fn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+Pj/9fz8//v/////////+vz8/+jp6P/GxMP/mpaT/21oY/9JQz3/NS0m/yohGf8oHhb/LSQc/zYz
LP9FT0n/W3d0/3Ojo/+Iysz/k+Pm/5Tu8v+Q8PX/ie3z/4Lq8f9/6vH/furx/33q8f966fD/defw/2zk
7/9g4e//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Utzu/2Hh
7/9u5e//eOjw/3/r8f+E7fL/h+3z/4jt8v+I6/H/hunw/4Lm7f993ub/ddDY/2q3vf9ck5X/TGtq/z9H
Qv82Lyf/MCMb/y4gGP8wJh7/OjMt/09KRf9zb2v/npyZ/8rIx//s6+v//f7+///////8////9vz8//H4
+P/w+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/x+fn/9Pz8//j+/v/5////9vv7/+/z
8v/k5uX/19fV/8fFw/+0sq//npuY/4WCf/9saWf/V1RR/0dDP/87NjH/Miwm/ywlHv8nHxf/JBsT/yIZ
EP8iGRD/JBsT/ycfF/8sJR7/Miwm/zs2Mf9HQz//V1RR/2xpZ/+Fgn//npuY/7Syr//HxcP/19fV/+Tm
5f/v8/L/9vv7//n////4/v7/9Pz8//H5+f/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4//D4
+P/x+Pj/9vz8//z//////////f7+/+zr6//KyMf/npyZ/3Nva/9PSkX/OjMt/zAmHv8uIBj/MCMb/zYv
J/8/R0L/TGtq/1yTlf9qt73/ddDY/33e5v+C5u3/hunw/4jr8f+I7fL/h+3z/4Tt8v9/6/H/eOjw/27l
7/9h4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Utzu/2Dh
7/9u5e//eejw/4Ps8v+M7/T/kvH1/5Pw9P+P6/D/g+Tr/3PZ4/9hy9f/UrnG/0ihrP8/gYf/Ol9g/zZC
Pv80Lyf/MyYe/zMmHv83Lij/Qj04/1dTUP94d3T/oaGg/8rLyv/q7Oz/+v7+//7////7////9fz8//H4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/y+fn/9/39//z////+////+fn5/+rp
6P/U0tD/ure0/6CcmP+KhYH/dnFt/2VgW/9VUEv/R0I9/zw3Mf8zLSf/LSYf/yggGf8kHBT/IhkQ/yEY
D/8hGA//IhkQ/yQcFP8oIBn/LSYf/zMtJ/88NzH/R0I9/1VQS/9lYFv/dnFt/4qFgf+gnJj/ure0/9TS
0P/q6ej/+fn5//7////8////9/39//L5+f/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+Pj/9fz8//v////+////+v7+/+rs7P/Ky8r/oaGg/3h3dP9XU1D/Qj04/zcuKP8zJh7/MyYe/zQv
J/82Qj7/Ol9g/z+Bh/9Ioaz/UrnG/2HL1/9z2eP/g+Tr/4/r8P+T8PT/kvH1/4zv9P+D7PL/eejw/27l
7/9g4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Udzu/1/g
7/9t5O//eejw/4Xt8/+S8fX/m/T3/53y9f+V6+//gN7l/2TM2P9It8f/MqGy/yiKmf8lb3j/KFRX/y09
Ov8yLyn/Nisk/zovKP9BOTT/TUpH/2FgXv+AgYD/paen/8nNzf/l6+v/9fv7//n////3////8/v7//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/z+vr/+P7+//7/////////9/f3/+Hg
3//Bvrv/nJiU/3p1cP9hW1X/UUtF/0dBOv9BOjT/PDUv/zYwKf8yKyT/Lycg/ywkHP8qIhr/KSEY/ygg
F/8oIBf/KSEY/yoiGv8sJBz/Lycg/zIrJP82MCn/PDUv/0E6NP9HQTr/UUtF/2FbVf96dXD/nJiU/8G+
u//h4N//9/f3///////+////+P7+//P6+v/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8/v7//f////5////9fv7/+Xr6//Jzc3/paen/4CBgP9hYF7/TUpH/0E5NP86Lyj/Nisk/zIv
Kf8tPTr/KFRX/yVveP8oipn/MqGy/0i3x/9kzNj/gN7l/5Xr7/+d8vX/m/T3/5Lx9f+F7fP/eejw/23k
7/9f4O//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4ft8/+X8/f/ovb4/6X09v+a6+3/f9jf/1vAy/84pbX/HYye/xJ1hf8TXWn/G0hN/yc4
Nv8xMCr/OjEq/0M6NP9OSET/XVpZ/3FxcP+Njo7/rLCw/8vQ0P/j6ur/8fj4//X9/f/1/f3/8vr6//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H4+P/y+fn/9vz8//n9/f/3+fn/7Ozs/9LQ
z/+sqaX/gn14/1xWUP9DPDX/Ny8o/zMsJP80LSX/Ni8n/zYvKP82Lyj/NzAp/zgxKf85Mir/OjIq/zoy
Kv86Mir/OjIq/zkyKv84MSn/NzAp/zYvKP82Lyj/Ni8n/zQtJf8zLCT/Ny8o/0M8Nf9cVlD/gn14/6yp
pf/S0M//7Ozs//f5+f/5/f3/9vz8//L5+f/x+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8vr6//X9/f/1/f3/8fj4/+Pq6v/L0ND/rLCw/42Ojv9xcXD/XVpZ/05IRP9DOjT/OjEq/zEw
Kv8nODb/G0hN/xNdaf8SdYX/HYye/ziltf9bwMv/f9jf/5rr7f+l9Pb/ovb4/5fz9/+H7fP/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4ju9P+Z9Pj/pfj6/6j19v+d6ev/gNLX/1q0vv8zlKL/F3iI/wxicP8OTlf/Fz5B/yUz
Mf8zMSv/QDgx/1BHQf9hW1j/dHJx/4iJif+go6P/ur6//9LY2P/l7Oz/8Pj4//T8/P/z/Pz/8fn5//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//L5+f/z+/v/9Pv7//P6+v/x9/b/7/Pz/+vt7P/i4uH/0tDP/7e0
sf+Sjon/a2Vf/0lCO/80LCT/KyMb/ysjG/8vKCH/Ni8o/zs0Lv9COzX/SUM8/1BJQ/9VT0j/WFJL/1pT
Tf9aU03/WFJL/1VPSP9QSUP/SUM8/0I7Nf87NC7/Ni8o/y8oIf8rIxv/KyMb/zQsJP9JQjv/a2Vf/5KO
if+3tLH/0tDP/+Li4f/r7ez/7/Pz//H39v/z+vr/9Pv7//P7+//y+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8fn5//P8/P/0/Pz/8Pj4/+Xs7P/S2Nj/ur6//6Cjo/+IiYn/dHJx/2FbWP9QR0H/QDgx/zMx
K/8lMzH/Fz5B/w5OV/8MYnD/F3iI/zOUov9atL7/gNLX/53p6/+o9fb/pfj6/5n0+P+I7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4nu9P+Z9fn/pvn7/6r29v+f5+j/g8zP/16pr/84hI3/HWVw/xFQWf8RPkT/GDMz/yUu
Kv81Miv/SEA6/2BYU/95dHH/kZCP/6enp/+6vb3/zdHR/9zi4v/o8PD/7/j4//L7+//y+/v/8fn5//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//T7+//4/v7/+v////j9/f/x9PT/5Obl/9TU0//BwL3/rKml/5KO
if90bmn/Vk9I/z01Lf8tJR3/KCAZ/yojHP8yKyX/OzYw/0ZBO/9UT0r/ZF9a/3Nuaf9+eXT/hH97/4iD
fv+Ig37/hH97/355dP9zbmn/ZF9a/1RPSv9GQTv/OzYw/zIrJf8qIxz/KCAZ/y0lHf89NS3/Vk9I/3Ru
af+Sjon/rKml/8HAvf/U1NP/5Obl//H09P/4/f3/+v////j+/v/0+/v/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8fn5//L7+//y+/v/7/j4/+jw8P/c4uL/zdHR/7q9vf+np6f/kZCP/3l0cf9gWFP/SEA6/zUy
K/8lLir/GDMz/xE+RP8RUFn/HWVw/ziEjf9eqa//g8zP/5/n6P+q9vb/pvn7/5n1+f+J7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9P+Z9vn/pfr8/6n19v+g5eX/h8bH/2SeoP9Cdnn/KFVY/xw/Qv8YMTH/HSkm/ycq
JP84Myz/UElC/3BpZP+RjYr/sK+t/8bHx//W2Nj/4OTl/+ft7f/s8/P/8Pj4//H6+v/x+fn/8Pn5//D4
+P/w+Pj/8Pj4/+/4+P/w+Pj/8fn5//b8/P/8//////////v8/P/u7ez/19XT/7q3tP+dmJX/gn14/2tl
X/9WT0j/RDw0/zYuJv8uJh7/LSUe/zErJP85NC//RUE9/1VRTv9rZ2T/g4B9/5qWk/+rqKX/tbGu/7m2
s/+5trP/tbGu/6uopf+alpP/g4B9/2tnZP9VUU7/RUE9/zk0L/8xKyT/LSUe/y4mHv82Lib/RDw0/1ZP
SP9rZV//gn14/52Ylf+6t7T/19XT/+7t7P/7/Pz///////z////2/Pz/8fn5//D4+P/v+Pj/8Pj4//D4
+P/w+Pj/8Pn5//H5+f/x+vr/8Pj4/+zz8//n7e3/4OTl/9bY2P/Gx8f/sK+t/5GNiv9waWT/UElC/zgz
LP8nKiT/HSkm/xgxMf8cP0L/KFVY/0J2ef9knqD/h8bH/6Dl5f+p9fb/pfr8/5n2+f+I7/T/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+Y9vr/pPr8/6j19v+h4+P/isHA/2uVlP9Mamj/M0dE/ycyL/8hJSH/ISEb/yom
H/86NC3/V1BJ/314c/+no6D/ysnI/+Li4v/t7/D/8fX1//D29v/v9vb/8Pj4//D5+f/w+fn/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//b9/f/8//////////n7+//m5+b/x8XD/6Cdmf96dXD/XFZQ/0lC
O/89NS3/Ni4m/zMrI/8zKyT/NS8o/zs2Mf9FQj7/VFFP/2dmZP+CgYD/oZ+e/728u//T0dD/393c/+Xk
4v/l5OL/393c/9PR0P+9vLv/oZ+e/4KBgP9nZmT/VFFP/0VCPv87NjH/NS8o/zMrJP8zKyP/Ni4m/z01
Lf9JQjv/XFZQ/3p1cP+gnZn/x8XD/+bn5v/5+/v///////z////2/f3/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D5+f/w+fn/8Pj4/+/29v/w9vb/8fX1/+3v8P/i4uL/ysnI/6ejoP99eHP/V1BJ/zo0
Lf8qJh//ISEb/yElIf8nMi//M0dE/0xqaP9rlZT/isHA/6Hj4/+o9fb/pPr8/5j2+v+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9vv/o/r9/6j19v+h4uH/jL27/2+Pi/9RYVz/Oj03/y0pIf8lHRb/JBwT/ysj
G/88NC3/W1VO/4aBff+0sa7/29vZ//P09P/8////+/////b8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//T6+v/3/Pz/9/r6/+7v7//Y19b/tLKv/4qFgf9hW1X/Qzw1/zQs
JP8tJR3/LiYe/zMrJP84MSv/Pzo0/0lFQf9VU1H/ZmVk/3t8e/+YmZn/uLm5/9bX1v/s7e3/+fr5////
////////+fr5/+zt7f/W19b/uLm5/5iZmf97fHv/ZmVk/1VTUf9JRUH/Pzo0/zgxK/8zKyT/LiYe/y0l
Hf80LCT/Qzw1/2FbVf+KhYH/tLKv/9jX1v/u7+//9/r6//f8/P/0+vr/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/2/Pz/+/////z////z9PT/29vZ/7Sxrv+GgX3/W1VO/zw0
Lf8rIxv/JBwT/yUdFv8tKSH/Oj03/1FhXP9vj4v/jL27/6Hi4f+o9fb/o/r9/5f2+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GMiP9UXVf/PTkx/y8kG/8nGhH/JRkQ/ywi
Gv88NS3/XFZQ/4mEgP+4tbP/4eDe//n6+f////////////r////1/Pz/8/v7//P7+//z+/v/8/v7//P7
+//z/Pz/9Pz8//T8/f/z+/v/8fj4/+/19f/s8PH/5ejo/9jZ2f/BwL//npuY/3Zxbf9RS0T/Ny8o/ysj
G/8oIBn/LSUe/zUvKP8/OjT/S0dD/1pYVf9ra2n/fn9//5SWlv+usLD/ysvL/+Pk5P/29vb/////////
//////////////b29v/j5OT/ysvL/66wsP+Ulpb/fn9//2traf9aWFX/S0dD/z86NP81Lyj/LSUe/ygg
Gf8rIxv/Ny8o/1FLRP92cW3/npuY/8HAv//Y2dn/5ejo/+zw8f/v9fX/8fj4//P7+//0/P3/9Pz8//P8
/P/z+/v/8/v7//P7+//z+/v/8/v7//X8/P/6///////////////5+vn/4eDe/7i1s/+JhID/XFZQ/zw1
Lf8sIhr/JRkQ/ycaEf8vJBv/PTkx/1RdV/9xjIj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jbu4/3GMh/9UXVb/PTgw/zAjGv8nGRD/JRkQ/ywi
Gf88NS3/XFZQ/4mEgP+4tbL/4eDe//n6+v////////////3////4////9v////b////2////9v////b/
///3////+P////n////3////8fn5/+ju7//c4eH/zdDQ/7u7u/+joqH/hYJ//2RfW/9HQTr/Mywk/ysj
G/8qIxz/MSsk/zs2Mf9JRUH/WlhV/25ubP+Fh4b/m56e/7CztP/FyMj/2dzc/+vs7P/4+fn/////////
//////////////j5+f/r7Oz/2dzc/8XIyP+ws7T/m56e/4WHhv9ubmz/WlhV/0lFQf87NjH/MSsk/yoj
HP8rIxv/Mywk/0dBOv9kX1v/hYJ//6Oiof+7u7v/zdDQ/9zh4f/o7u//8fn5//f////5////+P////f/
///2////9v////b////2////9v////j////9///////////////5+vr/4eDe/7i1sv+JhID/XFZQ/zw1
Lf8sIhn/JRkQ/ycZEP8wIxr/PTgw/1RdVv9xjIf/jbu4/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GNiP9TXlf/PDkx/y8kHP8nGhH/JRkQ/ywi
Gv88NS3/XFZQ/4iEgP+3tbL/4ODe//j6+v////////////z////3////9v////b+///2/v//9v7///b/
///3////+f////n////2////7fX1/93k5P/Jzs7/srW1/5ucnP+Eg4L/bGlm/1VQS/9BOjT/NC0l/y8o
If8yKyX/OTQv/0VCPv9VU1H/a2tp/4WHhv+go6P/uL29/8vQ0f/a4OD/5evs/+709P/1+/v/+v////z/
///8////+v////X7+//u9PT/5evs/9rg4P/L0NH/uL29/6Cjo/+Fh4b/a2tp/1VTUf9FQj7/OTQv/zIr
Jf8vKCH/NC0l/0E6NP9VUEv/bGlm/4SDgv+bnJz/srW1/8nOzv/d5OT/7fX1//b////5////+f////f/
///2////9v7///b+///2/v//9v////f////8///////////////4+vr/4ODe/7e1sv+IhID/XFZQ/zw1
Lf8sIhr/JRkQ/ycaEf8vJBz/PDkx/1NeV/9xjYj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3CNif9TX1n/PDoz/y8mHv8nGxP/JRoS/ywi
Gv87NC3/WVRO/4KAfP+usK3/1NjX/+vy8f/0/Pz/9f39//L5+f/u9vb/7fX1/+319f/t9fX/7fX1/+31
9f/v9/f/8fn5//L6+v/u9vX/4urp/87U1P+0uLj/mJqa/35/fv9paGf/V1RR/0dCPf88NS//Ni8n/zYv
KP87NjD/RUE9/1RRT/9mZWT/fn9//5uenv+4vb3/0dfX/+Ho6P/q8fH/7vX1//D39//x+Pj/8/r6//T7
+//0+/v/8/r6//H4+P/w9/f/7vX1/+rx8f/h6Oj/0dfX/7i9vf+bnp7/fn9//2ZlZP9UUU//RUE9/zs2
MP82Lyj/Ni8n/zw1L/9HQj3/V1RR/2loZ/9+f37/mJqa/7S4uP/O1NT/4urp/+729f/y+vr/8fn5/+/3
9//t9fX/7fX1/+319f/t9fX/7fX1/+729v/y+fn/9f39//T8/P/r8vH/1NjX/66wrf+CgHz/WVRO/zs0
Lf8sIhr/JRoS/ycbE/8vJh7/PDoz/1NfWf9wjYn/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8mHv8nHBT/JhsT/ywj
G/86Myv/VE9I/3h2cf+en5z/v8PB/9Ta2P/d4+L/3uTj/9vh4P/Y3t3/2N7d/9je3f/Y3t3/2N7d/9je
3f/Z397/3OLh/9zi4f/Y3t3/zdLR/7i8u/+doJ//gYKB/2hoZv9WVFL/R0RA/z03Mv83MCn/Ni8o/zs0
Lv9GQTv/VVFO/2dmZP97fHv/lJaW/7C0tP/L0NH/4ejo/+729v/z+/v/9Pz8//L6+v/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/y+vr/9Pz8//P7+//u9vb/4ejo/8vQ0f+wtLT/lJaW/3t8e/9nZmT/VVFO/0ZB
O/87NC7/Ni8o/zcwKf89NzL/R0RA/1ZUUv9oaGb/gYKB/52gn/+4vLv/zdLR/9je3f/c4uH/3OLh/9nf
3v/Y3t3/2N7d/9je3f/Y3t3/2N7d/9je3f/b4eD/3uTj/93j4v/U2tj/v8PB/56fnP94dnH/VE9I/zoz
K/8sIxv/JhsT/yccFP8vJh7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8mHv8oHRX/Jx0U/y0k
G/84MCn/TEZA/2hlX/+GhYH/oKGe/7CzsP+3urj/uLu5/7a5tv+ztrT/s7a0/7O2tP+ztrT/s7a0/7O2
tP+0t7X/trm3/7e6t/+0t7T/qqyq/5iamP+CgoD/ampn/1ZUUv9IRUH/PTg0/zUvKf8zLCX/Ni8o/0I7
Nf9UT0r/a2dk/4KBgP+YmZn/r7Gy/8XKyv/a4OD/6vHx//P7+//2////9f7+//L7+//w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+/v/9f7+//b////z+/v/6vHx/9rg4P/Fysr/r7Gy/5iZmf+CgYD/a2dk/1RP
Sv9COzX/Ni8o/zMsJf81Lyn/PTg0/0hFQf9WVFL/ampn/4KCgP+Ympj/qqyq/7S3tP+3urf/trm3/7S3
tf+ztrT/s7a0/7O2tP+ztrT/s7a0/7O2tP+2ubb/uLu5/7e6uP+ws7D/oKGe/4aFgf9oZV//TEZA/zgw
Kf8tJBv/Jx0U/ygdFf8vJh7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8nH/8pHhb/KR4W/y0k
HP81Lib/Qzw1/1VRSv9pZmH/enl0/4WFgP+KioX/ioqG/4mJhP+Ih4P/iIeD/4iHg/+Ih4P/iIeD/4iH
g/+IiIP/iomF/4qKhf+Ih4P/gYB8/3V0b/9mY1//VlNO/0hEQP8+OTT/NjAq/zApI/8wKSH/NzAp/0lD
PP9kX1r/g4B9/6Gfnv+4ubn/y83O/9re3v/l6+z/7vX1//T8/P/1/v7/9Pz8//L6+v/w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+vr/9Pz8//X+/v/0/Pz/7vX1/+Xr7P/a3t7/y83O/7i5uf+hn57/g4B9/2Rf
Wv9JQzz/NzAp/zApIf8wKSP/NjAq/z45NP9IRED/VlNO/2ZjX/91dG//gYB8/4iHg/+KioX/iomF/4iI
g/+Ih4P/iIeD/4iHg/+Ih4P/iIeD/4iHg/+JiYT/ioqG/4qKhf+FhYD/enl0/2lmYf9VUUr/Qzw1/zUu
Jv8tJBz/KR4W/ykeFv8vJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8nH/8qHxf/KyAY/y4l
Hf8zKyP/OjMr/0M9Nv9OSEL/V1JM/1xYUv9fW1X/X1tV/19aVP9eWlT/XlpT/15aU/9eWlP/XlpT/15a
U/9eWlT/X1tV/19bVf9eWlT/WlZQ/1RQSv9MR0H/RD84/z03Mf83MSv/MSoj/y0lHv8uJh//ODEp/1BJ
Q/9zbmn/mpaT/728u//W19b/5Obn/+vw8P/u9PT/8Pf3//L6+v/y+/v/8vr6//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8vr6//L7+//y+vr/8Pf3/+709P/r8PD/5Obn/9bX1v+9vLv/mpaT/3Nu
af9QSUP/ODEp/y4mH/8tJR7/MSoj/zcxK/89NzH/RD84/0xHQf9UUEr/WlZQ/15aVP9fW1X/X1tV/15a
VP9eWlP/XlpT/15aU/9eWlP/XlpT/15aVP9fWlT/X1tV/19bVf9cWFL/V1JM/05IQv9DPTb/OjMr/zMr
I/8uJR3/KyAY/yofF/8vJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8rIBj/LCEZ/y4m
Hf8xKSH/Mysj/zYvJ/85Mir/PDUu/z43MP8/ODD/Pzgw/z44MP8+NzD/Pjcw/z43MP8+NzD/Pjcw/z43
MP8+NzD/Pjgw/z44MP8+NzD/PTYv/zs0Lf85Miv/Ny8o/zUtJv8yKyP/LSYe/yoiGv8tJR3/OTIq/1VP
SP9+eXT/q6il/9PR0P/s7e3/9/r6//n9/f/1+/v/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//X7+//5/f3/9/r6/+zt7f/T0dD/q6il/355
dP9VT0j/OTIq/y0lHf8qIhr/LSYe/zIrI/81LSb/Ny8o/zkyK/87NC3/PTYv/z43MP8+ODD/Pjgw/z43
MP8+NzD/Pjcw/z43MP8+NzD/Pjcw/z43MP8+ODD/Pzgw/z84MP8+NzD/PDUu/zkyKv82Lyf/Mysj/zEp
If8uJh3/LCEZ/ysgGP8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKCD/MCcf/y8nHv8vJh3/LyYd/y8mHP8vJRz/LiUc/y8lHP8vJRz/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJRz/LyUc/y4lHP8vJRz/LyYc/y8mHf8vJh3/MCce/zAnH/8vJx7/KyMa/ykgGP8sIxv/OTIq/1hR
Sv+Dfnn/s6+s/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+s/4N+
ef9YUUr/OTIq/ywjG/8pIBj/KyMa/y8nHv8wJx//MCce/y8mHf8vJh3/LyYc/y8lHP8uJRz/LyUc/y8l
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8lHP8vJRz/LiUc/y8lHP8vJhz/LyYd/y8mHf8vJx7/MCcf/zAo
IP8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wJx//LyYd/y4kGv8sIhf/KyAU/ysfE/8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8qHxL/Kh8S/yof
Ev8qHxL/Kh8S/yofEv8qHxL/KyAT/ywhFf8tIhf/LiQZ/y8lG/8vJRv/KyIY/ykgFv8sIxv/OTIq/1hR
S/+Dfnn/s6+t/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+t/4N+
ef9YUUv/OTIq/ywjG/8pIBb/KyIY/y8lG/8vJRv/LiQZ/y0iF/8sIRX/KyAT/yofEv8qHxL/Kh8S/yof
Ev8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8rHxP/KyAU/ywiF/8uJBr/LyYd/zAn
H/8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKB//LyYd/y4lGv8uIxf/LSEU/ywgE/8sIBL/LCAS/ywgEv8sIBL/LCAT/ywgE/8sIBP/LCAT/ywg
E/8sIBL/LCAS/ywgEv8sIBL/LSET/y0iFf8uIxf/LyUZ/zAmG/8vJhv/LCIY/ykgFv8sIxv/OjIq/1hR
S/+Dfnn/s6+t/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+t/4N+
ef9YUUv/OjIq/ywjG/8pIBb/LCIY/y8mG/8wJhv/LyUZ/y4jF/8tIhX/LSET/ywgEv8sIBL/LCAS/ywg
Ev8sIBP/LCAT/ywgE/8sIBP/LCAT/ywgEv8sIBL/LCAS/ywgEv8sIBP/LSEU/y4jF/8uJRr/LyYd/zAo
H/8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKCD/MCgf/y8nHv8vJh3/LyYd/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHf8vJx3/MCce/zAnH/8vJx7/KyMa/ykgGP8sIxv/OjIq/1hR
Sv+Dfnn/s6+s/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+s/4N+
ef9YUUr/OjIq/ywjG/8pIBj/KyMa/y8nHv8wJx//MCce/y8nHf8vJh3/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYd/y8mHf8vJx7/MCgf/zAo
IP8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRj/LCIZ/y8m
Hf8wKCH/Lykj/y4qJ/8uKyr/LSwt/y0sL/8sLDD/LCww/ywsMP8sLC//LCwv/ywsL/8sLC//LCwv/yws
L/8sLC//LCww/ywsMP8sLC//LCwu/ywrLf8sKir/LCko/ywoJv8sJyP/KSMe/ycgGv8rJB3/OTEq/1VP
SP9+eXT/q6il/9PR0P/s7e3/9/r6//n9/f/1+/v/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//X7+//5/f3/9/r6/+zt7f/T0dD/q6il/355
dP9VT0j/OTEq/yskHf8nIRr/KSMe/ywnI/8tKCb/LCko/ywqKv8sKy3/LCwu/ywsL/8sLDD/LCww/yws
L/8sLC//LCwv/ywsL/8sLC//LCwv/ywsL/8sLDD/LCww/ywsMP8tLC//LSwt/y4rKv8uKif/Lykj/zAo
If8vJh3/LCIZ/ywhGP8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIBf/LSEY/y8m
Hf8vKSP/Lisr/ysuNv8oMUH/JjRL/yU2Uf8kNlT/JDZU/yQ2U/8lNVL/JTVS/yU1Uv8lNVL/JTVS/yU1
Uv8lNlL/JTZT/yU2U/8lNVL/JDRO/yMxSP8iLUD/Iio4/yInMf8jJSv/IiEj/yMgHv8pIx//NzAp/1BK
Q/90bmn/mpeT/728u//W19b/5Obn/+vw8P/u9PT/8Pf3//L6+v/y+/v/8vr6//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8vr6//L7+//y+vr/8Pf3/+709P/r8PD/5Obn/9bX1v+9vLv/mpeT/3Ru
af9QSkP/NzAp/yokH/8lIR7/JCMk/yUnK/8lKTH/JCw4/yQvQf8kMkj/JTRO/yU1Uv8lNlP/JTZT/yU1
Uv8lNVL/JTVS/yU1Uv8lNVL/JTVS/yU1Uv8kNlP/JDZU/yQ2VP8lNlH/JjRL/ygxQf8rLjb/Lisr/y8p
I/8vJh3/LSEY/ywgF/8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIBb/LSEW/y8l
HP8vKib/Ky41/yc0Sv8iOmD/HT9z/xtDfv8ZRIP/GUOD/xpDgf8aQn//GkJ//xpCf/8aQn//GkJ//xpC
f/8aQoD/GkOB/xpDgf8aQn//GT95/xg5bf8WMl3/FCtN/xQlP/8WIjX/GR8q/x4fI/8mIyH/NC4p/0pD
PP9mYFr/hIB9/6Ggnv+4ubn/y83O/9re3v/l6+z/7vX1//T8/P/1/v7/9Pz8//L6+v/w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+vr/9Pz8//X+/v/0/Pz/7vX1/+Xr7P/a3t7/y83O/7i5uf+hoJ7/hIB9/2Vg
Wv9KQzz/NS8p/yglIv8hIiT/HiMr/xwnNv8aKkH/GS9O/xk1Xv8aO23/Gj95/xpCf/8aQoH/GkKB/xpC
gP8aQn//GkJ//xpCf/8aQn//GkJ//xpCf/8aQ4H/GUOD/xlEg/8bQ37/HT9z/yI6YP8nNEr/Ky41/y8q
Jv8vJRz/LSEW/ywgFv8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnHv8sIBX/LSAU/y8l
G/8uKij/KTE//yI5Xv8aQn//FEqb/xBPrf8OUbT/DlG0/w9Qsf8PT6//D06u/w9Orv8PTq7/D06u/w9O
rv8PT6//D1Cx/w9Qsv8PTq//Dkql/w1ClP8KOH3/CS9m/wknUf8NIkH/EyA0/xogKv8lJCX/Mi0o/0M8
Nf9XUEr/bGhk/4OBgP+YmZn/r7Gy/8XKyv/a4OD/6vHx//P7+//2////9f7+//L7+//w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+/v/9f7+//b////z+/v/6vHx/9rg4P/Fysr/r7Gy/5iZmf+DgYD/bGhk/1ZQ
Sv9CPDX/Mi0o/yclJf8eIyr/GCQ1/xMnQ/8QLFL/DjNn/w47fv8PRJT/D0ul/w9Or/8PULL/D0+x/w9P
r/8PTq7/D06u/w9Orv8PTq7/D06u/w9Pr/8PULH/DlG0/w5RtP8QT63/FEqb/xpCf/8iOV7/KTE//y4q
KP8vJRv/LSAU/ywgFf8wJx7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnHv8tHxT/LiAT/y8l
G/8uKyv/JzJH/x49bv8USJf/DFG7/wdX0f8FWtv/BVrc/wVa2f8GWdb/BlnW/wZZ1v8GWdb/BlnW/wZZ
1v8GWdf/Blra/wZb2v8GWdb/BlXL/wZNtv8GQpv/Bjd//wkvZv8NKVL/FCZA/xwlMv8mJir/MCwo/zw1
Lv9JQjv/V1NO/2hmZP97fHv/lJaW/7C0tP/L0NH/4ejo/+729v/z+/v/9Pz8//L6+v/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/y+vr/9Pz8//P7+//u9vb/4ejo/8vQ0f+wtLT/lJaW/3t8e/9oZmT/V1NO/0lC
O/88NS7/MCso/yUmKf8bJDL/EiVA/wsoUf8HLWX/BTZ//wVBm/8FTLb/BlXL/wZZ1v8GW9r/Blra/wZZ
1/8GWdb/BlnW/wZZ1v8GWdb/BlnW/wZZ1v8FWtn/BVrc/wVa2/8HV9H/DFG7/xRIl/8ePW7/JzJH/y4r
K/8vJRv/LiAT/y0fFP8wJx7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3CNif9TX1n/PDoz/zAnHv8tHxP/LiAS/y8l
Gv8tKyz/JjJK/xw9df8RSKL/CFLK/wJY4/8AXO7/AF7x/wBe7/8BX+3/AV/t/wFf7f8BX+3/AV/t/wFf
7f8AYO//AGDx/wBg8v8AX+7/Alzi/wdXzv8MULT/EkiX/xhBff8dO2b/IjRR/yYvPf8qKy//MCsn/zcw
KP8+NzD/SEM+/1RST/9mZWT/fn9//5uenv+4vb3/0dfX/+Ho6P/q8fH/7vX1//D39//x+Pj/8/r6//T7
+//0+/v/8/r6//H4+P/w9/f/7vX1/+rx8f/h6Oj/0dfX/7i9vf+bnp7/fn9//2ZlZP9VUk//SUM+/0A5
MP84MCj/Lyon/yQnLv8aJTv/DyZN/wcqYv8CL3n/ADmU/wBFsf8AUcz/AVri/wFf7v8BYfL/AWHx/wFg
7/8BX+3/AV/t/wFf7f8BX+3/AV/t/wFf7f8AXu//AF7x/wBc7v8CWOP/CFLK/xFIov8cPXX/JjJK/y0r
LP8vJRr/LiAS/y0fE/8wJx7/PDoz/1NfWf9wjYn/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GNiP9TXlf/PDkx/zEmHP8tHhL/Lh8R/zAl
Gv8tKiz/JjFK/xs5df8QQqL/B0vK/wFS5P8AV/H/AFv2/wBe9v8AYPX/AGL2/wBi9/8AYvf/AGL3/wBi
9v8AYfj/AGD5/wBg+v8AX/f/Bl/t/xJh3f8hYsn/MGOx/ztgmf8/WYH/PU1l/zc+Sv8yMTT/Lyol/zEp
If81LSX/PDYv/0ZCP/9VU1H/a2tp/4WHhv+go6P/uL29/8vQ0f/a4OD/5evs/+709P/1+/v/+v////z/
///8////+v////X7+//u9PT/5evs/9rg4P/L0NH/uL29/6Cjo/+FhoX/a2pp/1VTUf9HQz//Pzkw/zoy
Jv82LSL/Lyol/yUnMf8aJ0X/EChc/wcsdv8BMo7/ADyo/wBIwv8AVNr/AF3s/wBi9/8AZPv/AGP6/wBi
+P8AYvf/AGL3/wBi9/8AYvf/AGL2/wBg9f8AXvb/AFv2/wBX8f8BUuT/B0vK/xBCov8bOXX/JjFK/y0q
LP8wJRr/Lh8R/y0eEv8xJhz/PDkx/1NeV/9xjYj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jbu4/3GMh/9UXVb/PTgw/zElG/8uHhH/Lx8R/zAl
Gv8tKiv/Ji5I/xszcP8QOpv/B0DB/wFH2/8ATen/AFTw/wBa8/8AX/X/AGL3/wBj+P8AY/j/AGL3/wBi
9/8AYPj/AF75/wBd+f8AXvf/C2Hx/yBr5/88eNv/VoLL/2eGt/9qfp7/YGp9/05RWf88Ojr/MCok/ywk
G/8tJRz/Mywl/zw3Mf9JRUH/WlhV/25ubP+Fh4b/m56e/7CztP/FyMj/2dzc/+vs7P/4+fn/////////
//////////////j5+f/r7Oz/2dzc/8XIyP+ws7T/m56e/4WHhv9ubmz/WVdV/0lFQf8+OTL/OTEm/zct
Hv80Kh3/Lykk/yYoNf8bKE//ECpt/wcui/8BNKT/AD66/wBJz/8AVeH/AF3v/wBi9/8AZPr/AGP6/wBi
+P8AYvf/AGL3/wBj+P8AY/j/AGL3/wBf9f8AWvP/AFTw/wBN6f8BR9v/B0DB/xA6m/8bM3D/Ji5I/y0q
K/8wJRr/Lx8R/y4eEf8xJRv/PTgw/1RdVv9xjIf/jbu4/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GMiP9UXVf/PTkx/zElHP8uHxL/LiAS/zAl
Gv8tKSr/JitE/xstaP8QMI//BzWy/wE7y/8AQ9v/AEzl/wBW6/8AXfD/AGHz/wBi9f8AYvX/AGH0/wBh
8/8AX/T/AF30/wBc9P8AXvP/D2bw/y537v9Wjur/e6Hi/5Sr1P+Worr/hImV/2dna/9KRUT/NC4o/ywk
G/8qIhn/Lice/zYvKP8/OjT/S0dD/1pYVf9ra2n/fn9//5SWlv+usLD/ysvL/+Pk5P/29vb/////////
//////////////b29v/j5OT/ysvL/66wsP+Ulpb/fn9//2traf9ZWFX/S0dD/z86NP84MSn/NSwg/zQq
G/8zKRz/Likm/yYpPf8bK1z/EC1//wcyoP8BOLj/AEHL/wBL2v8AVeX/AF3u/wBh8/8AYvX/AGL1/wBh
9P8AYfP/AGH0/wBi9P8AYvX/AGHz/wBd8P8AVuv/AEzl/wBD2/8BO8v/BzWy/xAwj/8bLWj/JitE/y0p
Kv8wJRr/LiAS/y4fEv8xJRz/PTkx/1RdV/9xjIj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9vv/o/r9/6j19v+h4uH/jL27/2+Pi/9RYVz/Oj03/y8qIv8sIxf/LSMW/y8m
HP8tKCn/JihA/xwoYP8RKYP/Byyj/wEyu/8AO83/AEba/wBS5P8AW+v/AGDw/wBi8v8AYfL/AGHx/wBg
8P8AYPD/AF/w/wBf8f8GZPH/GW/w/z+G8/9uovX/mrz0/7fI6v+5wNL/o6Ss/4B9f/9bVlT/QDo0/zMr
JP8uJh3/LyYe/zMrJP84MSv/Pzo0/0lFQf9VU1H/ZmVk/3t8e/+YmZn/uLm5/9bX1v/s7e3/+fr5////
////////+fr5/+zt7f/W19b/uLm5/5iZmf97fHv/ZmVk/1VTUf9JRUH/Pzo0/zgxK/8zKyT/MSgf/zEo
Hv8vKCP/LCox/yQrSv8aLmz/DzKR/wY2sv8BPMn/AETY/wBN4v8AVuj/AFzt/wBg8P8AYfL/AGHx/wBg
8f8AYPD/AGHx/wBi8v8AYvL/AGDw/wBb6/8AUuT/AEba/wA7zf8BMrv/Byyj/xEpg/8cKGD/JihA/y0o
Kf8vJhz/LSMW/ywjF/8vKiL/Oj03/1FhXP9vj4v/jL27/6Hi4f+o9fb/o/r9/5f2+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/13g
7/9r5O//eOjw/4fv9f+X9vr/pPr8/6j19v+h4+P/isHA/2uVlP9Mamj/M0dE/ygzL/8mKiL/Kigd/y0p
IP8tKSn/Jic8/xwmWP8RJXf/ByiV/wEtrf8AN8H/AETR/wBQ3/8AWun/AGDw/wBh8v8AYfL/AGDx/wJh
8P8GZPD/C2fx/xNs8f8hdPL/N4Lz/1ya+P+Jtf3/sc7+/8za9v/O0+L/ubnA/5iVl/90b2//WFJP/0dA
Ov88NS3/Ni4m/zQsI/80LCT/NzAp/z04Mv9HQz//VVJP/2hmZP+DgYD/oaCe/728u//T0dD/393c/+Xj
4v/l4+L/393c/9PR0P+9vLv/oaCe/4OBgP9oZmT/VVJP/0dDP/8+OTL/ODEp/zMrJP8vKCL/LSYk/ysn
Kv8qKTX/JixG/x8vYP8WMoH/DTek/wU8wv8BQtb/AEni/wBR6f8AWOz/AF3u/wBg8P8AYfH/AGHx/wBg
8P8AYPD/AGHx/wBi8v8AYvL/AGDw/wBa6f8AUN//AETR/wA3wf8BLa3/ByiV/xEld/8cJlj/Jic8/y0p
Kf8tKSD/Kigd/yYqIv8oMy//M0dE/0xqaP9rlZT/isHA/6Hj4/+o9fb/pPr8/5j2+v+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9C1Or/T9vt/1zg
7/9p5O//dujw/4bu9P+X9vn/pPn7/6n19v+g5eX/h8bH/2WeoP9Cdnn/KFVY/x1AQv8dNTL/JC8o/yss
Jf8sKSn/JiY4/xwkT/8RJGr/ByaF/wEsnf8ANrP/AEPI/wBQ2v8AWuf/AGDw/wBh8/8AYPP/AGDx/wVj
8P8RavH/IXTy/zWB8/9Lj/T/ZJ72/4Sz+v+myf//xdv//9jk+//Z3+z/ysvS/7Gvs/+VkpP/fHd2/2hi
Xv9WTkf/Rj40/zsxJv80Kx//Myof/zYuJf89NzD/SEM+/1dTTv9saGT/hIB9/5qXk/+rqKX/tbGu/7m2
s/+5trP/tbGu/6uopf+al5P/hIB9/2xoZP9XU07/SUM+/z85MP85MSb/NSwg/zEoH/8tJiT/KSYv/yUo
Pv8iK1H/HS5m/xczf/8QOJv/Cj63/wREz/8BSt//AE/o/wBV7f8AWu7/AF7v/wBg8P8AYfH/AGHw/wBg
8P8AYPD/AGHx/wBi8/8AYvP/AGDw/wBa5/8AUNr/AEPI/wA2s/8BLJ3/ByaF/xEkav8cJE//JiY4/ywp
Kf8rLCX/JC8o/x01Mv8dQEL/KFVY/0J2ef9knqD/h8bH/6Dl5f+p9fb/pfr8/5n2+f+I7/T/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zXK4v9C1Or/Ttvt/1vg
7/9o4+//defw/4Xu9P+X9fj/pPn7/6n29v+f5+j/g8zP/16pr/84hI3/HWVw/xJQWf8VQkT/Hjc0/ygw
K/8rKin/JiYz/x0kRf8RJFz/ByZ1/wEsjP8ANqX/AEO9/wBQ1P8AWub/AF/w/wBg8/8AX/P/AF/x/wdl
8P8ccfL/OYPz/1mX9f95q/f/k7z5/6zL/P/C2f//0+T//93o/f/e5fP/1trk/8jJ0f+2tbr/op+i/4yH
h/9ya2f/WFBI/0M5Lv82LB//MSca/zIpHf83Lyb/Pzgw/0lCO/9WUEr/ZWBa/3Ruaf9+eXT/hH97/4eC
fv+Hgn7/hH97/355dP90bmn/ZWBa/1ZQSv9JQjv/QDkw/zoyJv83LR7/NCob/zEoHv8rJyr/JSg+/x8q
V/8ZLnL/EzKK/w43oP8KPrb/BkbK/wJM2v8AUub/AFbs/wBa7/8AXO//AF/v/wBg8P8AYfD/AGDw/wBg
8P8AYPD/AGHx/wBi8/8AYvT/AGDw/wBa5v8AUNT/AEO9/wA2pf8BLIz/ByZ1/xEkXP8dJEX/JiYz/ysq
Kf8oMCv/Hjc0/xVCRP8SUFn/HWVw/ziEjf9eqa//g8zP/5/n6P+q9vb/pvn7/5n1+f+J7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9C1Or/UNvu/13g
7/9q5O//d+jw/4fu8/+Y9Pj/pfj6/6j19v+d6ev/gNLX/1q0vv80lKL/F3iI/w1icP8RUFf/HEFB/yc1
Mf8rLCr/JiYu/x0jO/8RJE7/Bydl/wEtfP8AN5b/AESz/wBQzv8AWuT/AF/w/wBf9P8AXvT/AF/x/wpm
8f8ld/L/S4/0/3Wp9/+cwfn/uNL7/8re/f/V5f7/3On+/97q/f/f6Pj/3eTz/9fd6//N0d7/vsDL/6am
rf+GhIb/ZWBe/0hBO/82LST/LiUb/y4lHP8yKiH/NzAo/zw1Lv9CPDX/SkM8/1BKQ/9VT0j/WFJL/1pT
Tf9aU03/WFJL/1VPSP9QSkP/SkM8/0I8Nf88NS7/ODAo/zYtIv80Kh3/Mykc/y8oI/8qKTX/IitR/xku
cv8RMZL/Cjar/wY9v/8ERc7/Ak3a/wFU4/8AWer/AFzu/wBe8P8AX/D/AF/w/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9P8AYvT/AGDw/wBa5P8AUM7/AESz/wA3lv8BLXz/Bydl/xEkTv8dIzv/JiYu/yss
Kv8nNTH/HEFB/xFQV/8NYnD/F3iI/zOUov9atL7/gNLX/53p6/+o9fb/pfj6/5n0+P+I7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/w+YsP8bqcL/KLvU/zbK4v9E1er/U9zu/2Ph
7/9y5fD/gOnx/43u9P+b9Pf/pff5/6b19v+a6+3/f9jf/1u/y/83pbX/HYye/xN1hf8WX2n/H0tN/yg5
Nv8sLSr/JyYq/x4jMv8UJEL/CihW/wQtbP8BN4n/AESq/wBRyf8AW+L/AF/w/wBf9f8AXfT/AF7y/wpm
8f8oefL/UpP1/4Cv9/+oyfr/xNr7/9Tk/P/c6f3/3ur9/97q/P/e6fz/3un9/9vm/P/T3vb/xM/m/6y0
yf+KkKD/Z2h0/0dGTP8yLzL/KSUm/ygjIv8rJiT/Lion/zArKP8yLSj/NS8p/zcwKf85MSr/OjIq/zoy
Kv86Mir/OjIq/zkxKv83MCn/NS8p/zItKP8wKyj/Lyon/y8qJf8vKST/Likm/ywqMf8mLEb/HS5m/xMy
iv8KNqv/BDzF/wFC1v8ASuD/AFPm/wBZ6v8AXu7/AGDw/wBg8f8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9P8AYvX/AGDw/wBb4v8AUcn/AESq/wE3if8ELWz/CihW/xQkQv8eIzL/JyYq/ywt
Kv8oOTb/H0tN/xZfaf8TdYX/HYye/ziltf9bwMv/f9jf/5rr7f+l9Pb/ovb4/5fz9/+H7fP/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8AgZn/Bomh/w6XsP8ZqcL/JrvT/zTK4v9G1er/Wt3v/2/j
8f+C6PL/kOzz/5rw9f+h9Pf/o/X4/6Dz9f+U6+//ft3l/2PM1/9Ht8f/MqGy/yiKmf8ncHj/KlVX/y4+
Ov8uLSn/KSQk/yEhKf8YIzb/ECdI/wsuX/8HOH7/BESj/wJRxv8BW+L/AGDx/wBg9/8AXvX/AF/y/wlm
8f8kdvL/SY30/3Gm9v+Xvvn/ss/6/8Xb+//T4/z/2+j9/97q/f/e6v7/2Oj//8/i///B2P//r8fz/5at
2f94i7T/WGaL/zxGZv8qMEv/ISY8/x8jNP8hJDH/JCYu/yUmKf8nJST/KSQg/yokHf8sIxr/LSMY/y0j
F/8tIxf/LSMY/ywjGv8qJB3/KSQg/yclJP8lJin/JScu/yUnMf8mKDX/Jik9/yQrSv8fL2D/FzN//w83
oP8HPb//AkLW/wBJ4/8AUOr/AFft/wBd7v8AYPD/AGLx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9v8AYvf/AGHx/wFb4v8CUcb/BESj/wc4fv8LLl//ECdI/xgjNv8hISn/KSQk/y4t
Kf8uPjr/KlVX/ydweP8oipn/MqGy/0i3x/9kzNj/gN7l/5Xr7/+d8vX/m/T3/5Lx9f+F7fP/eejw/23k
7/9f4O//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6V/wB+lf8AgZn/Bomh/w2XsP8WqMH/I7rT/zLJ4f9H1er/Yt7w/37m
8v+W6/T/pu/1/6vy9v+o9Pf/ofP2/5fw9P+M6/D/f+Pq/2/Z4/9fy9f/UrnG/0ihrP9Bgof/O2Bg/zdC
Pv8xLSf/KyIf/yUfIP8fISr/GSc6/xQuUf8POHP/CkWc/wVSxP8CXOP/AGH0/wBh+f8AYPf/AGDz/wdk
8f8acPH/NIDz/1KT9f9wpvb/i7b4/6XH+f++1vv/0eL8/9zp/f/b6P7/zeH//7fV//+exP//hrD2/2+Y
4v9We8X/P16k/yxEhf8eMm3/Fyhc/xYlT/8XJUT/GSU7/xskMf8eIij/IiEg/yYgGf8pHxT/Kh4R/yse
D/8rHg//Kh4R/ykfFP8mIBn/IiEg/x4iKP8bJDH/GiU7/xonRf8aKFD/Gytd/xoubP8WMoH/ETib/ws+
tv8FRc7/AUrg/wBQ6v8AVu7/AFvw/wBe8P8AYfH/AGLx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHz/wBj+P8AY/n/AGH0/wJc4/8FUsT/CkWc/w84c/8ULlH/GSc6/x8hKv8lHyD/KyIf/zEt
J/83Qj7/O2Bg/0GCh/9Ioaz/UrnG/2HL1/9z2eP/g+Tr/4/r8P+T8PT/kvH1/4zv9P+D7PL/eejw/27l
7/9g4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6V/wB+lf8AgZn/BYmh/wyXsP8VqMH/IrrT/zPK4f9M1uv/beDx/5Dp
9P+t7/b/vfP4/731+P+x9Pf/oPH2/5Du8/+G6vD/gejv/37l7f963ub/dNDY/2q3vf9dlJX/Tmxq/z9I
Qv80Lif/LSIb/ykeGf8mISD/Iicv/x0uRv8XOGn/D0WV/wlSwP8DXOL/AGH0/wBi+v8AYfj/AGDz/wRj
8f8OafH/HHLx/y588/9DifT/W5n1/32u9/+ixfn/wtn7/9Xl/P/T5P3/vNf+/5rC/v90qvv/VpP0/0B+
5v8waNP/I1O8/xlBpv8SNJL/Dix//wwobf8NJ1z/DyZN/xMkP/8YIzP/HyIn/yYiHv8rIRf/LSET/y8h
Ef8vIRH/LSET/yshF/8mIh7/HyIn/xgjM/8TJD//DyZN/w4oXf8PKm7/Dy1//w8ykf8NN6T/Cj63/wZG
yv8DTdr/AVPm/wBX7f8AW/D/AF3w/wBf8P8AYfH/AGHx/wBh8f8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHz/wBj+P8AY/r/AGL0/wNc4v8JUsD/D0WV/xc4af8dLkb/Iicv/yYhIP8pHhn/LSIb/zQu
J/8/SEL/TWxq/1yTlf9qt73/ddDY/33e5v+C5u3/hunw/4jr8f+I7fL/h+3z/4Tt8v9/6/H/eOjw/27l
7/9h4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/w6XsP8YqcL/JrvU/zrL4v9W2Oz/e+Py/6Ls
9v/B8vj/0fb6/833+f+69Pj/ovD1/47s8/+F6/H/hu3z/43v9f+T7vL/k+Pm/4jKzP90pKP/XHh0/0VP
Sf81Miz/LSQc/ysgFv8rIhr/Kicm/yYtPP8eN2D/FUSM/wtQuP8EWtz/AGDv/wBh9v8AYfb/AGDy/wJh
8P8EY/D/B2Xw/w5o8f8acPL/MH7z/1aW9f+Fs/j/r836/8jc/P/F2/z/p8n7/3yu+f9Okfb/K3jw/xhm
6P8PV93/C0rR/wk/wv8HN7L/BTGf/wQti/8FK3X/Byli/wsoUv8TJ0P/HCc2/yUnLP8sJyT/MCcf/zEn
HP8xJxz/MCcf/ywnJP8lJyz/HCc2/xMnQ/8LKFL/Bypi/wUsdv8FLov/BjKg/wY2sv8FPML/BETP/wNM
2v8BVOP/AFnq/wBd7v8AXvD/AF/w/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9v8AYvb/AGDv/wRa3P8LULj/FUSM/x43YP8mLTz/Kicm/ysiGv8rIBb/LSQc/zUy
LP9FT0n/XHh0/3Sko/+Iysz/k+Pm/5Tu8v+Q8PX/ie3z/4Lq8f9/6vH/furx/33q8f966fD/defw/2zk
7/9g4e//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/CImh/xOZsP8iq8P/NL7V/0rP5P9n3O7/jOb0/7Hv
+P/P9fr/3vj7/9j4+v/D9fj/qvH1/5Xt8/+M7PP/kfH2/5v3+/+k+Pr/pe/w/5jX1/9/sK//YYOB/0VZ
Vv8yOzb/Kisk/yklGv8sJRr/Ligi/yotNP8iNVb/GECA/w1Mq/8FVc7/AFvj/wBe7f8AX+//AF/v/wBg
7/8AX/D/AF7w/wBe8P8DYvD/Fm7x/zuF8/9rovb/lr35/7DO+v+tzPr/j7r5/2Ke9/8zgfT/EWnv/wFa
6/8AT+b/AEff/wBC1v8BPMn/ADi4/wA0o/8AMY3/ATB5/wYuaP8OLln/GC5N/yEuQv8oLjr/LC41/y4u
M/8uLjP/LC41/yguOv8hLkL/GC5N/w4uWf8GLmj/ATB5/wAyjf8ANKP/ADi4/wE8yf8BQtb/AUrf/wBS
5v8AWer/AF7u/wBg8P8AYfH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg
8P8AYO//AF/v/wBf7/8AXu3/AFvj/wVVzv8NTKv/GECA/yI1Vv8qLTT/Ligi/ywlGv8pJRr/Kisk/zI7
Nv9FWVb/YoOB/4Cwr/+Z19f/pe/w/6P4+v+Z9vr/i/D2/3/q8f946PD/dufw/3Xn8P9z5u//b+Xv/2fi
7/9c3+//T9vt/0LU6v81yuL/KbvU/xyqwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyU/wB8lP8Bf5f/DImg/x6asP80rsT/TcTX/2fV5/+D4vH/ouv3/8Hy
+v/Z9/v/5Pn8/9/5+//O9vn/uPL3/6Xv9f+e8PX/ofX5/6n7/f+v/f7/rfX1/53e3v9/ubn/XY6P/z1m
Z/8oSEn/ITY0/yMtJv8pKiD/Lioi/ywsL/8kMkv/GTpw/w5El/8FTLj/AFLN/wBX2/8AW+T/AF7q/wBg
7v8AX/H/AFzx/wBa8f8AXPD/DmXx/y158v9TkfX/dqj3/4y2+P+Jtfj/cKX3/0yO9f8mdfL/C2Lw/wBW
7f8AT+v/AEvo/wBH4v8ARNj/AEDK/wA+uP8AO6b/ADqV/wQ4hv8LOHr/Ezhv/xo4Zv8gOGD/Izhb/yQ4
Wf8kOFn/Izhb/yA4YP8aOGb/Ezhv/ws4ev8EOIb/ADqV/wA7pv8APbj/AEDK/wBE2P8ASeL/AE/o/wBW
7P8AXO7/AGDw/wBi8f8AYvH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYfH/AGHy/wBh
8f8AYO7/AF7q/wBb5P8AV9v/AFLN/wVMuP8ORJf/GTpw/yQyS/8sLC//Lioi/ykqIP8jLSb/ITY0/yhI
Sf8+Zmf/X4+P/4K6uv+f397/rPX1/6r8/f+d+fz/jPH3/33q8f915/D/cOXv/2zk7v9p4+7/ZeHu/13f
7f9V3e7/S9nt/0HU6v82yuL/KrzU/x2qwv8QmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8Bfpb/EYig/yqbsf9Ks8b/a8rb/4nd6/+j6vX/u/H6/9D2
/P/f+Pz/5/r8/+P5/P/Y9/r/yfX5/7zz9/+18/f/tfj7/7f9/v+3/v7/r/b2/5rh4v95wMP/U5qf/zF0
fP8cWF//FkVJ/xs4Nv8kMSr/LC0m/ywsLf8lLkH/GjNe/w46f/8FQZz/AEiz/wBPxv8AVtb/AFvj/wBf
7f8AYPL/AF7z/wBc8v8AXPD/CmLw/x9v8f85gfP/UZH1/2Cb9f9emvX/TY/1/zR+8/8abfH/B2Dw/wBY
7v8AU+3/AFHs/wBP6P8ATeL/AEvY/wBJzP8AR7//AEaz/wNFqf8HRaD/DUWY/xJFkv8WRY3/GEWK/xlF
if8ZRYn/GEWK/xZFjf8SRZL/DUWY/wdFoP8DRan/AEaz/wBHv/8ASMz/AEvY/wBN4v8AUen/AFXt/wBa
7/8AXvD/AGDx/wBh8f8AYfH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfL/AGLz/wBi
8v8AYO3/AFvj/wBV1v8AT8b/AEiz/wVBnP8OOn//GjNe/yUuQf8sLC3/LC0m/yQxKv8bODb/FkVJ/xxY
X/8zdXz/V5qg/37BxP+e4uP/rfb2/6z8/f+f+fz/jfH2/33q8f9y5u//auPu/2Th7f9e3u3/WNzs/1La
7P9M2e3/Rtft/z/T6v82y+L/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8Cfpf/FYqh/zefs/9guMn/idLe/6zl7//D8fj/0/f8/975
/f/k+fz/5/n8/+b5/P/h+fv/2vj7/9P3+v/M9/r/yfr8/8X9/v+9/f3/r/X2/5bj5f9zx83/TKWv/ymF
kv8Tanj/DlZg/xVFSf8gOTb/KjAr/ysrK/8kKjf/GixN/w4wZv8FNoD/AD2X/wBGr/8AUMf/AFjc/wBe
6/8AYfL/AGD0/wBf8/8AXvH/BWHw/xFp8f8fcvL/LHvy/zSA8/8zf/P/Knny/xxx8v8OZ/H/BGDw/wBc
7/8AWe//AFju/wBX7P8AVuj/AFTj/wBT3P8AUtX/AFLP/wJRyf8EUcT/B1HA/wpRvf8MUbr/DVG5/w1R
uP8NUbj/DVG5/wxRuv8KUb3/B1HA/wRRxP8CUcn/AFLP/wBS1f8AU9z/AFTj/wBW6P8AWOz/AFru/wBc
7/8AX/D/AGDw/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfP/AGL0/wBi
8v8AX+v/AFjc/wBPx/8ARq//AD2X/wU2gP8OMGb/GixN/yQqN/8rKyv/KjAr/yA5Nv8VRUn/DlZg/xNq
eP8rhZL/UKaw/3jHzf+Z5Ob/qvX1/6r6+/+e9/r/jvH2/33q8f9x5e//ZuHu/1ze7P9T2uv/S9fq/0bW
6v9D1uz/QNXs/zzS6f81yuL/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB/l/8HhJv/H5Cm/0WmuP90v83/otni/8fs8v/b9/v/5fv+/+f7
/v/n+v3/5/n8/+j6/P/o+vz/6Pr8/+X6/P/f+vz/2fz9/9D+/v/E/Pz/svX2/5fl6f9zztb/TLK//yqW
p/8UfY//D2d1/xVTWv8gQUH/KTQw/ysqKv8kJi//GiY9/w8pUf8GLmf/ATR+/wA+m/8ASrn/AFTU/wBc
5/8AYPH/AGH0/wBg8/8AYPH/AmHw/wZj8P8KZvH/D2nx/xJr8f8Ra/H/Dmnx/wpm8f8FY/D/AWHw/wBf
8P8AXu//AF3v/wBd7v8AXO3/AFzr/wBc6f8AW+b/AFvk/wFb4/8BW+H/Alvg/wNb3/8EW97/BFvd/wVb
3f8FW93/BFvd/wRb3v8DW9//Alvg/wFb4f8BW+P/AFvk/wBb5v8AXOn/AFzr/wBc7f8AXe7/AF7v/wBf
7/8AX/D/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfP/AGH0/wBg
8f8AXOf/AFTU/wBKuf8APpv/ATR+/wYuZ/8PKVH/GiY9/yQmL/8rKir/KTQw/yBBQf8VU1r/D2d1/xR9
j/8rlqf/TrK//3TO1v+V5ej/pfP0/6b3+f+c9fj/jfD1/33q8f9w5e//Y+Dt/1bb7P9K1+r/QdPp/zzS
6f860+r/OdPr/zjQ6P8yyeH/KbvU/x2qwv8QmLD/Bomh/wCBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8Afpf/AH+X/wOBmf8Fgpr/CYSb/xGIn/8gkKX/Op2w/2Cxwf+MydT/tt/m/9fw9f/o+fz/7fz//+z8
/v/p+v3/6Pn8/+r6/P/s+v3/7vv9/+78/f/q/P3/4/39/9r+/v/M/Pz/uvb3/6Hp7f9/19//WsHO/zqp
uv8lkqT/HXqI/x9haP8mSUr/LDYy/yspJ/8lIyf/HSIw/xMkQP8LKVP/Bi9s/wQ5i/8CRK3/AU/N/wBX
4/8AXO//AF7z/wBf8v8AX/D/AF/w/wBf8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg8f8AYPH/AGDx/wBg
8f8AYPH/AGDx/wBg8f8AYPH/AGDx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYPH/AGDx/wBg8f8AX/P/AF70/wBc
7/8AV+P/AU/M/wJErf8EOYv/Bi9r/wspU/8TJED/HCIw/yUjJ/8rKSf/LDYy/ydKSv8gYWj/HnqI/ySS
o/84qbr/VsDN/3bW3v+R5+v/n/L0/6D19/+Y8/f/i+/0/33p8f9w5e//YuDt/1Pa6/9G1er/PNHo/zbQ
6P8z0On/MtDp/zDN5v8sxt//I7nS/xmowf8Ol6//BYmh/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8Ae5T/AH2V/waAmP8Rhp3/H42j/zGXq/9Ho7T/YbHA/4LCzv+l1N3/xubs/97z9v/r+vz/7/z+/+z7
/v/p+v3/6Pn8/+r6/P/u+/3/8fz9//H8/f/v/f3/6f3+/+L+/v/W/Pz/x/j4/7Hu8v+U4un/dNLd/1e/
zf9Cqrj/No+a/zJwdf8wUVD/Lzcy/ywnIv8mHx7/IB4k/xkhMf8UJ0T/Dyxc/wo1fv8GP6P/A0nG/wFQ
4P8AVe3/AFjy/wBa8v8AW/D/AFzw/wBc8P8AXPD/AFzw/wBb8P8AXPD/AF3w/wBe8P8AX/D/AGDw/wBg
8P8AYfD/AGHx/wBh8f8AYfH/AGLy/wBi8/8AYvT/AGL1/wBi9f8AYvb/AGL2/wBi9/8AYvf/AGL3/wBi
9/8AYvf/AGL3/wBi9/8AYvf/AGL2/wBi9v8AYvX/AGL1/wBi9P8AYvP/AGLy/wBh8f8AYfH/AGHx/wBh
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHx/wBh8v8AYfP/AGHz/wBf8/8AXfT/AFr0/wBW
7v8BUOD/A0jG/wY/o/8KNX7/Dyxc/xQnRP8ZITH/IB4k/yYfHv8sJyL/MDcy/zJRUP80cHX/OY+a/0Gp
uP9Rvsz/ZtDb/3ze5v+N6O7/lu/z/5fy9f+R8fX/h+7z/3zp8f9x5e//Y+Dt/1Pa7P9F1er/OdDo/zLO
5/8tzef/Kszn/yfJ5P8iwtz/G7XQ/xKlv/8Lla7/BIih/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeJH/AHuU/wqBmf8di6H/N5ms/1Wpuf90ucb/jsfR/6fU3f++4ef/0uzx/+H0+P/p+fz/6/r9/+r6
/f/o+fz/6Pn8/+r6/P/t+/3/8Pz9//H8/f/w/P3/7f3+/+j9/v/g/P3/1Pn6/8P09v+t7fL/k+Pr/3vV
3v9mwcv/VqSr/0l/gf8+WVf/NTk0/y0lH/8oHRj/JB0b/yEhJv8dJjf/GCtP/xIycv8MOpr/BkG//wJI
2v8ATen/AFLv/wBW8P8AWe//AFvw/wBc8P8AXPD/AFzw/wBc8P8AXPD/AF3w/wBe8P8AX/D/AGDw/wBg
8P8AYfD/AGHw/wBh8f8AYfH/AGHy/wBh8/8AYvP/AGL0/wBi9f8AYvX/AGL1/wBi9v8AYvb/AGL2/wBi
9v8AYvb/AGL2/wBi9v8AYvb/AGL1/wBi9f8AYvX/AGL0/wBi8/8AYfP/AGHy/wBh8f8AYfH/AGHw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPH/AGHy/wBi8/8AYvT/AGH0/wBe9P8AWvT/AFXx/wBP
6v8CSNr/BkG//ww5mv8SMnL/GCtP/x0mN/8hISb/JB0b/ygdGP8tJR//NTk0/0BaV/9NgIL/WaSr/2XB
yv9v093/et/o/4Pm7f+J6vD/jO3y/4zv9P+J7vP/g+zy/3vp8f9x5e//ZOHu/1Xb7P9G1er/OdDo/zDN
5/8oy+b/Isnk/xzE4f8Wvdn/EbHN/wuivf8GlK3/A4ig/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeZL/AH2W/w6FnP8pk6f/TqW2/3e6x/+dztf/t9zi/8jl6v/T7PD/2/H1/+D1+f/l+Pv/5/n8/+f5
/P/n+fz/5/n8/+n6/P/s+/3/7vv9/+/8/f/v/P3/7v39/+39/f/p/P3/4fv7/9X4+v/F9vn/svL2/57p
7f+K19v/dri6/2GPj/9NZWH/PEA6/zAqI/8rIBj/KR8X/ygjH/8mJy7/IStF/xkvZ/8QNY7/CDq0/wJA
0P8AR+H/AE3p/wBU7P8AWe7/AF3v/wBf8f8AX/H/AF/w/wBf8P8AX/D/AF/w/wBf8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBh8f8AYfH/AGHx/wBh8v8AYfL/AGHy/wBh8v8AYfL/AGHy/wBh
8v8AYfL/AGHy/wBh8v8AYfL/AGHy/wBh8v8AYfL/AGHx/wBh8f8AYfH/AGDx/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHx/wBi8v8AYvL/AGDx/wBc7/8AVu7/AE/q/wBH
4f8CQdD/CDq0/xA1jv8ZL2f/IStF/yYnLv8oIx//KR8X/ysgGP8wKiP/PUA6/09lYf9lkI//eLi7/4bW
2/+M5uv/jOzy/4ns8/+F6/H/g+vx/4Hr8v+A6/L/furx/3no8P9w5e//ZOHu/1bb7P9H1ur/OtDo/y7M
5v8kyeT/GsXi/xLA3v8Mudb/B63K/wSgu/8Dkqz/AYeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8CgZn/C4Wc/x2Oo/88nrD/ZbLA/5PJ0v+73eP/1Oru/9/x9P/i9Pf/4fX4/+H1+f/i9/r/5Pj7/+X4
/P/m+fz/5/n8/+n6/P/r+vz/7Pv9/+77/f/u/P3/7/z9//D8/f/u/P3/6vz8/+L7/f/X/f7/yv3+/7r3
+P+n5+j/kMnJ/3agnv9cdXH/RU9J/zY3MP8wKiH/LiYb/y4nHv8tKSj/Jyo7/x4sWv8UMH//DDSj/wY7
wP8EQ9L/Bk3e/wlY5f8LYer/DGbv/wpn8f8HZvH/BGPx/wFh8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYO//AGDu/wBg7f8AX+v/AFzn/wBX4/8AUOD/AEja/wJB
0P8FOr//DDWk/xUwgP8fLVv/Jyo7/y0pKP8uJx7/LiYb/zAqIf82NzD/RU9J/111cf94oZ7/j8nJ/57m
5/+g8/b/mfX5/47x9v+D6/L/fOnw/3no8P946PD/d+jw/3Tm7/9s5O//YeDt/1Tb7P9H1ur/OtDo/y3M
5v8hyOT/FcPh/wu93P8EtdT/AarI/wCduv8Akav/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8olKj/MZir/0Cgsv9crr3/gsDM/6rV3P/O5+r/4vHz/+n2+P/p9/n/5fb5/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+n6/P/q+vz/6/v9/+z7/f/u+/3/7/z9//H8/f/x/P3/7/z9/+r9/v/k////2////8/+
/v++8vH/ptjW/4m0sv9sjYr/Umpm/0BRS/84QDj/NDUp/zMuIv8wKiT/Kicw/yEmSf8XKGj/EC2I/w01
o/8QQbj/GVLK/yJj2f8qceX/K3jt/yR28f8acPL/D2jx/wVi8P8AX/D/AF7x/wBf8f8AYPH/AGHy/wBh
8v8AYfH/AGHx/wBh8f8AYfH/AGHw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHw/wBh8f8AYfH/AGHx/wBh
8f8AYfL/AGHy/wBh8v8AYfP/AGHz/wBh8v8AX+//AF7q/wBb4/8AWNz/AFTU/wFPzP8DSMb/BUG//wg6
tP8MNaT/EjCK/xorav8jKEr/Kygx/zAqJP8zLiL/NTUp/zhAOP9AUUv/UGpm/2mNiv+EtLH/nNfW/6rv
7/+q+fv/n/n8/5Dz+P+B7PP/eOjw/3Pm7/9w5e//buTv/2vj7v9k4O7/W93t/1DZ6/9E1er/OdDo/y3M
5f8gx+P/E8Lg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP9gsL7/ZrPB/3G4xf+Gws3/odDY/77f5P/Y7O//5vP1/+v3+P/p9/n/5fb6/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+j5/P/p+vz/6vr8/+v7/f/s+/3/7vv9//D7/f/x/P3/8Pz9/+79/v/s////6P///9//
///R9/f/uuTj/5zJyP99q6r/YY2M/010cv9CXlj/O0lA/zY4Lf8xKyP/KiMm/yEfNP8ZIEv/FCVk/xUv
ff8gQZb/Mlqw/0Z0yf9TiN3/VZDr/0mM8v80f/P/HXDy/wpj8f8AXfH/AFzy/wBd8/8AYPT/AGH0/wBi
9P8AYvT/AGLz/wBi8v8AYvL/AGHx/wBh8f8AYfD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBh8P8AYfH/AGHx/wBi8v8AYvL/AGLz/wBi
8/8AYvT/AGL0/wBi9v8AY/j/AGP4/wBi9v8AX+//AFvk/wBV1v8AT8f/AUq5/wNErf8HP6P/Czma/xA1
jv8VMID/Gitq/yAmUP8mIzj/LCQn/zIrI/83OC3/PElA/0JdWP9NdHL/XY2M/3Sqqf+OyMf/o+Lh/670
8/+t+/v/ofn8/5Hz9/+B7PL/dufw/27l7/9p4u7/ZOHt/1/e7f9Y3Oz/Udnr/0nX6/9B0+n/ONDo/y3M
5f8gx+P/FMLg/wm82/8Cs9P/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP+Xy9T/m83W/6HQ2P+t1t3/vd7j/87m6v/d7vD/5fP0/+f19//m9vj/4/b5/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+j5/P/o+vz/6fr8/+n6/P/q+vz/7Pv9/+77/f/v+/3/8Pz9//D9/v/w////7////+r/
///e+vr/ye7u/6zd3v+Oycv/cbK1/1ybnP9Nfn3/QmBb/zpEPP8zLif/KyEg/yMbJP8dGzH/GyFD/yEt
Wf8zRHX/UGWW/2yHuf+Bodb/g6vq/3Cj8v9QkPT/LXny/xBm8f8BXfH/AFvy/wBc8/8AX/T/AGH0/wBi
9P8AYvT/AGLz/wBi8v8AYvL/AGHx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBh8f8AYfH/AGHx/wBi8v8AYvL/AGLz/wBi
9P8AYvT/AGL1/wBi9/8AY/n/AGP6/wBi9v8AXu3/AFfb/wBPxv8ARq//AT6b/wU5i/8LNX7/EjJy/xkv
Z/8fLVv/IyhK/yYjOP8pICj/LSMh/zMvJ/86RDz/Q2Bb/05+ff9bmpz/a7K0/3/Iyv+U29z/pevr/671
9f+r+fr/oPf5/5Hx9v+B6/L/defw/2vj7v9h4O3/Wd3s/1La6/9L1+r/R9bq/0LU6v8+0un/N8/n/y3M
5f8hx+P/FMLg/wm82/8CtNP/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP++3+T/v9/l/8Ph5v/I4+j/z+fr/9fr7v/e7vH/4vHz/+Pz9f/i9Pf/4vX4/+H2+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/o+fz/6Pn8/+j5/P/p+vz/6vr8/+z7/f/u+/3/7/z9//D9/f/y/v7/8v///+/+
/v/l+/v/0fX2/7fu8P+b4+f/gNPY/2q9wf9ZnZ//S3h2/z9UT/82ODL/Ligj/ygfHv8lHiP/JyUv/zEz
Qv9KTV7/bXOF/5Garf+puNH/q8Po/5K48v9ooPX/O4Ty/xVt8P8BYfD/AFzw/wBc8P8AXvD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBh8f8AYfT/AGL0/wBg7/8AW+P/AFLN/wBIs/8APZf/ATR+/wYva/8OLFz/GCtP/yEr
Rf8nKjv/Kygx/ywkJ/8tIyH/MCkj/zY4Mv9AVVD/TXh2/1udn/9pvcH/eNLX/4jh5f+Y6+7/pPHy/6r1
9v+n9vf/nfT3/5Dw9P+B6/L/dOfw/2ji7v9c3uz/UNnr/0fW6v9B0+n/PtLp/zzS6f870en/Ns/n/y3M
5v8hyOP/FcPg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP/E4ub/xeLn/8jj6P/M5ur/0ujs/9jr7v/e7vH/4fHz/+Ly9f/i9Pf/4fX4/+H2+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6vr8/+z7/f/t+/3/7vz9/+/8/f/v/f3/7/39/+v8
/f/h+vz/0fn7/7v3+/+j8/j/i+ju/3jV2v9mtbn/VY+Q/0hpZ/8+TEb/ODo0/zQxK/81MCr/OzYx/0hE
Qf9iXlz/h4OC/6yqq//FyM//xtPm/63I8f+DsPT/VJPy/yx67/8Ua+3/CWPq/wRf5/8CXeT/AVvj/wBa
4/8AWeX/AFrn/wBa6f8AW+v/AFzs/wBd7v8AXu//AF/w/wBg8P8AYPH/AGDx/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg8f8AYPD/AF/w/wBe7/8AXe7/AFzs/wBb6/8AWun/AFrn/wBa
5v8AWuT/AFvi/wFb4v8CXOP/A1zi/wRa3P8FVc7/BEy4/wNBnP8ENoD/Bi5n/wspU/8UJ0T/HSY3/yYn
Lv8tKSj/MCok/zIrI/8zLyf/Njgy/z1LRv9Jamf/WJCQ/2i2uf921dr/g+ju/5Dx9v+b9fj/ovX3/6X1
9v+i9Pb/mfL1/43u8/+A6vH/dObw/2bh7v9Y3Oz/S9fq/0DT6f860ej/ONDo/znQ6P850Oj/Ns/n/y3M
5v8iyOP/FcPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP+m0tr/qNTb/67X3v+32+H/xOHm/9Ho7P/d7vH/5PL0/+b09v/l9fj/4/X5/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6/r8/+77/f/w/P3/8Pz9/+78/f/q+/z/5Pr8/9z5
+//S+Pr/xfn8/7b6/v+m+f7/lfP4/4Xk6f90ycz/Yqep/1OGhf9Ja2n/RlxX/0dUTf9OUkr/WVdO/2hj
Wf+BeW//oZmP/8C6s//V09H/1tzl/8HT7/+ev/L/dabw/1GP7P84fuf/JW/f/xdi1v8MWM7/BFHK/wBN
y/8ATND/AE3X/wBP3v8AUuT/AFXo/wBY7P8AXO//AF/y/wBh9P8AYvT/AGL0/wBh9P8AYfT/AGH0/wBh
9P8AYfT/AGH0/wBh9P8AYfT/AGL0/wBi9P8AYfT/AF/y/wBc7/8AWOz/AFXo/wBS5P8AUN//AFDa/wBQ
1P8AUM7/AVHJ/wNRxv8GUsT/CVLA/wtQuP8NTKv/DUSX/w06f/8NMGb/DylR/xMkQP8ZITH/ISEm/ygj
H/8uJx7/My4i/zc4Lf86RDz/QFVQ/0lqZ/9XiIf/Z6mr/3bKzv+E5On/jvL4/5b4/f+b+Pz/nfX4/53z
9v+a8vX/k/D0/4rt8v+A6vH/dOfw/2bh7v9X3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6P850Oj/Ns/o/y7M
5v8iyOT/FcPg/wq82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP9yucX/d7vI/4HAzP+TydP/qtXc/8Th5v/a7e//5vP1/+r2+P/o9/n/5fb5/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/7Pr9//D8/f/z/f3/8v39/+z8/f/h+vv/1Pf6/8b1
+P+69Pj/svX5/6v4/P+l+f7/nfb7/5Ls8P+C2Nz/cb/C/2GmqP9YkpP/WIaF/2CAff9tf3n/fYJ6/46K
gf+impH/ubGn/8/IwP/d2tb/3uDl/9Db7P+4zu//m7zt/36o6f9kleD/SX/S/y9owf8YU7L/CESr/wA9
rP8APLb/AD7C/wBC0P8ARtr/AEzi/wBS6f8AWe//AF70/wBi9/8AY/j/AGP4/wBi+P8AYvf/AGL3/wBi
9/8AYvf/AGL3/wBi9/8AYvj/AGP4/wBj+P8AYvf/AF70/wBZ7/8AUun/AEzi/wBG2v8ARNH/AEPI/wBD
vf8ARLP/AkSq/wVEo/8LRZz/EEWV/xVEjP8YQID/GTpw/xkzXv8ZLE3/GiY9/x0iMP8gHiT/JB0b/ykf
F/8uJhv/NTUp/zxJQP9DYFv/TXh2/1iQkP9nqav/d8PG/4ba3v+R7PD/mPb6/5r5/f+Z9/v/lvP3/5Pw
9P+P7/P/i+7y/4bs8v9+6vH/defw/2fi7v9Y3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6f850en/N9Do/y/N
5v8jyeT/FsPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP85nK//QKCy/0+nuP9ptML/i8XP/7HY3//S6ez/5PL0/+r3+P/p9/r/5ff6/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/7Pr9//H8/f/z/f3/8Pz9/+b7/P/V+Pr/wfT4/67x
9v+h8PX/nfH2/570+P+h9vr/ovb5/53x8/+Q5ef/f9XZ/3HGyf9pubz/bbK0/3qurv+Mrav/oa6r/7Kz
rv/Bu7b/z8jC/9rV0P/h39z/4uLk/9zh6f/Q2+z/wNHr/6vC5f+Qrdn/bZDF/0dwrf8lUpn/CzyO/wAx
kP8ALpz/ADCt/wA1v/8AO83/AELY/wBM4v8AVev/AF3x/wBh9v8AY/f/AGP3/wBi9/8AYvb/AGL2/wBi
9v8AYvb/AGL2/wBi9v8AYvf/AGP3/wBj9/8AYfb/AF3x/wBV6/8AS+L/AELY/wA7zf8AN8H/ADaz/wA2
pf8AN5b/AjeJ/wg4fv8POHP/Fzhp/x43YP8iNVb/JDJL/yQuQf8kKjf/JCYv/yUjJ/8mHx7/KB0Y/ysg
GP8wKiH/OEA4/0JdWP9Ofn3/W52f/2i2uf92ys7/htre/5Pn6v+c8fP/n/b5/5z2+v+W8/j/jvD1/4jt
8/+F7PL/g+vx/4Dr8f986fH/dOfw/2ji7v9Z3Oz/Stfq/z7S6f840Oj/N9Do/zjQ6f850en/N8/o/y/N
5v8jyOT/FcPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8LhZz/FIqg/yaTp/9EorP/bbbD/5rN1f/C4eb/2u3w/+Pz9f/l9fj/4/X5/+H1+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6vr8/+37/f/t+/3/5/r8/9r4+//F9fj/rvH2/5nt
9P+M7PL/i+3z/5Lw9P+c8/b/o/T2/6Pz9f+a7vD/jOfq/4Hf5P972d7/gtXa/5PT1/+p0tT/v9PT/9DU
0//a19X/4NvZ/+Pf3v/k4+L/4+Tl/+Tl6P/i5er/3OHp/87W4/+0wdX/jKG9/157ov8zV4r/Ej18/wIu
ff8AKYn/ACma/wAtrf8BMrv/ATrI/wFF1P8BUN7/AVnm/wFe6/8BYO3/AWDt/wFf7P8BX+v/AV/r/wFf
6/8BX+v/AV/r/wFf6/8BX+z/AWDt/wFg7f8BXuv/AVnm/wFQ3v8BRdT/ATrI/wEyu/8BLa3/ACyd/wAs
jP8BLXz/BC1s/wsuX/8ULlH/HS5G/yYtPP8qLTT/LCwv/ywsLf8rKyv/Kyoq/yspJ/8sJyL/LSUf/zAq
I/82NzD/QFFL/010cv9bmpz/ab3B/3bV2v+E5On/kezw/5zx8/+j8/X/o/T2/5zz9v+S8PT/iO3z/4Dq
8f986fH/e+nw/3rp8P946PD/ceXv/2bh7v9Y3Oz/Stfq/z/S6f840Oj/N9Do/zfQ6P830Oj/NM7n/yzM
5f8hyOP/FMPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8Ae5T/AH+X/w+Hnv8slqr/VKm5/3+/y/+o09v/weHm/9Dp7v/Y7/P/3fL2/+D1+f/j9/v/5fj7/+X4
/P/m+Pz/5vn8/+f5/P/o+fz/6Pn8/+j5/P/m+fz/5Pn8/+H4+//c9/v/0/b6/8Xz+P+y8Pb/nO30/4rr
8v+A6vH/gevx/4ru8/+W8fT/oPT2/6T09v+f8/b/mPH1/5Hu9P+Q7PL/mevw/6rq7v+/6ez/1Onq/+Lp
6P/p6Of/6ujn/+nn5v/m5+b/5ufm/+np5//s6+n/6+ro/+Li4v/Lz9T/prC+/3qMpP9PaYz/Lk59/xs8
e/8RMoH/DC2M/wormf8ILaT/BjOv/wY+uv8GScT/B1LM/wdX0f8HWdP/B1nT/wdY0v8HWNL/B1jS/wdY
0v8HWNL/B1jS/wdY0v8HWNL/B1nT/wdZ0/8HV9H/B1LM/wdJxf8HP7v/BzSw/wcso/8HKJX/BiaF/wYm
df8HJ2X/CihW/xAnSP8ZJzr/Iicv/yonJv8uKCL/Lioi/ywtJv8qMCv/KTQw/yw2Mv8wNzL/NTk0/z1A
Ov9FT0n/UGpm/12NjP9rsrT/eNLX/4Po7v+O8vj/mPb6/5/2+f+j9Pb/ofT2/5nx9f+O7vP/g+vy/3vp
8P925/D/dOfw/3Pm7/9w5e//auPu/2Df7f9U2+z/SNbq/z7S6f840Oj/Nc/n/zTO5/8yzeb/Lszl/yfJ
5P8cxuL/EsHf/wi82/8CtNP/AKnI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeJH/AHuU/wuCmv8hjqP/P52v/2Cuvf+BwMv/m87X/7Ha4f/E5Or/1O3y/+D0+P/n+Pv/6fn8/+j5
/P/m+Pz/5vj7/+f5/P/q+vz/7Pr9/+v6/f/m+fz/3ff7/9D0+f/C8fj/tO72/6bs9f+Y6vP/iuny/4Dp
8f976fD/ferx/4Xs8v+P7/P/mPH1/5/z9v+h9Pj/ovX5/6T2+/+p9vv/s/b7/8L2+v/T9vj/4vX2/+30
9P/w8vH/7u/v/+rt7P/n6ur/5eno/+nq6P/t7ej/7+zn/+rn4v/Z2Nf/vcDG/5uksv95iJ7/XG+Q/0Zb
h/80SYP/JjqB/xswgv8TLIX/Dy6L/w42lP8PQJ3/EEik/xBMqP8QTqr/EE6q/xBNqf8QTan/EE2p/xBN
qf8QTan/EE2p/xBNqf8QTan/EE6q/xBOqv8QTKj/EEik/xBBnv8QOJb/EDCN/xEpg/8QJXf/ECRq/xAk
XP8RJE7/FCRC/xgjNv8fISr/JiEg/ysiGv8sJRr/KSog/yQxKv8gOTb/IEFB/ydKSv8yUVD/QFpX/09l
Yf9ddXH/aY2K/3Sqqf9/yMr/iOHl/5Dx9v+W+P3/mvn9/5z2+v+c8/b/mfH1/5Lv9P+K7fL/gevx/3no
8P9z5u//b+Xv/2rj7v9l4e7/X9/t/1fc7P9O2Ov/RdXq/z3S6f830Oj/Ms7n/y7M5f8qyuT/JMji/x7F
4f8Vw+D/DcDe/wa72v8BtNP/AKrI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AepP/AHyV/weAmP8Uh57/JpGm/zydr/9Vqrr/b7jF/43H0v+s2OD/yOft/97y9v/p+fz/7Pr9/+n6
/f/m+Pv/5fj7/+j5/P/s+vz/7/v9/+37/f/k+fz/0vT6/7rv9/+j6fT/j+Xy/4Pk8f985PD/eeXw/3jn
8P956PD/e+rx/4Dr8f+G7fL/ju7z/5bw9f+g8/f/q/b6/7f4/P/C+v7/zfv+/9j7/v/j+/z/7Pr7//H5
+f/x9vb/7vPz/+rw8P/m7e3/5Ovr/+br6v/q7On/7Ovn/+rn4//g3tv/0NDR/7u+xf+kq7j/jZaq/3V/
m/9bZon/Q015/y44a/8fLGT/GSpk/xcuaf8ZNnD/Gz12/xtAef8bQXr/G0F6/xtAef8bQHn/G0B5/xtA
ef8bQHn/G0B5/xtAef8bQHn/G0F6/xtBev8bQHn/Gz12/xs4cv8bMm3/Gy1n/xwoYP8cJlj/HCRP/xwk
Rf8dIzv/HiMy/yEhKf8lHyD/KR4Z/ysgFv8pJRr/Iy0m/xs4Nv8VRUn/FVNa/yBhaP80cHX/TYCC/2WQ
j/94oZ7/hLSx/47Ix/+U29z/mOvu/5v1+P+b+Pz/mff7/5bz+P+S8PT/ju7z/4rt8v+E7PL/f+rx/3jo
8P9x5u//aePu/2Hf7f9Z3Oz/Utrr/0zY6/9H1ur/QtTq/zzS6f82z+f/L8zl/yfJ4/8gxuH/GcPf/xPB
3v8Nv97/CL3d/wS62f8BtNP/AKrI/wCduv8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AfZb/AH6X/wSBmP8Jg5v/D4ed/xqNov8slqn/RaO0/2i2xP+Sy9b/ueDn/9bv9P/m+Pv/6vr9/+j5
/f/k+Pv/4/f7/+b4+//r+fz/7fr8/+n6/P/c9/v/wvH4/6Pp9P+E4vH/bN3u/2Lc7f9j3e3/aeHu/3Hl
7/936PD/eunw/3vq8f9+6vH/g+vy/43t8/+d8PX/sfT4/8T4+//V+v3/4fz9/+n9/f/u/P3/8fz8//L6
+v/x+Pj/7fb2/+ny8//l8PH/4+3u/+Ts7P/m6+r/6Onn/+fm5P/j4eD/3Nzd/9TV2P/HytD/tbrD/5yh
rf98gJD/W15x/z5AVv8rLUX/IidA/yAoQf8jLUb/JTJL/yY0TP8mNE3/JjRN/yY0Tf8mNEz/JjRM/yY0
TP8mNEz/JjRM/yY0TP8mNE3/JjRN/yY0Tf8mNEz/JjNL/yYwSf8mLUf/JitE/yYoQP8mJzz/JiY4/yYm
M/8mJi7/JyYq/ykkJP8rIh//LSIb/y0kHP8qKyT/ITY0/xZFSf8OVmD/D2d1/x56iP85j5r/WaSr/3i4
u/+Pycn/nNfW/6Pi4f+l6+v/pPHy/6L19/+d9fj/lvP3/47w9f+I7fP/g+vy/4Hr8f9/6vH/fOnw/3fn
8P9u5O//Y+Dt/1jc7P9O2Ov/RtXq/0LU6f8/0+n/PdLp/znR6P8zzuf/Ksrk/yDG4f8Wwt7/Dr7c/wm8
2/8GvNv/A7vb/wK52f8AtNP/AKrI/wCduv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wGAmP8AgJj/AH+X/wOBmf8Nh53/JJOo/0qnuf93wM3/o9jh/8Xq8f/Z9Pn/4fj8/+P4
/P/h9/v/4Pb6/+L3+v/k9/v/4vf7/9v2+v/L8vj/ruv1/4vj8f9p2+7/Utbr/0rW6v9P2ev/W93s/2ni
7v9y5u//dufw/3bo8P936PD/e+nw/4br8v+Z7vT/sfL2/8n2+f/d+vv/6fz8//D9/f/y/f3/8/39//L8
/P/w+vr/7fj4/+n19v/l8vT/4/Dx/+Pt7v/l7Oz/5unp/+bn5v/k5eT/4uTl/97i5P/W3N//x87R/66z
t/+Mj5L/aGdq/0hFRv8zLi//KSUl/ycjJP8qJyj/LSor/y0rLP8tKyz/LSss/y0rLP8tKyz/LSss/y0r
LP8tKyz/LSss/y0rLP8tKyz/LSss/y0rLP8tKyz/LSss/y0qK/8tKSr/LSkq/y0oKf8tKSn/LCkp/ysq
Kf8rLCr/LC0q/y4tKf8xLSf/NC4n/zUyLP8yOzb/KEhJ/xxYX/8Tanj/FH2P/ySSo/9Bqbj/ZcHK/4bW
2/+e5uf/qu/v/6708/+u9fX/qvX2/6X19v+d8/b/k/D0/4jt8/+A6vH/e+nw/3no8P946PD/d+fw/3Lm
7/9p4u7/Xd7t/1DZ6/9F1er/PdLp/znR6P840Oj/N9Do/zXP5/8uzOX/Jcji/xnD3/8Pvtz/Brva/wK5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyU/wB7lP8Cf5j/FYuh/zWesv9dtsf/hc7c/6fh7P+97PX/zfL5/9f1
+v/d9fr/3vX6/9z1+f/W8/n/zPH3/77t9f+r6fP/kOPx/3Lc7v9W1uv/Q9Pp/z7T6f9E1er/Udrr/1/f
7f9p4u7/buTv/2/l7/9x5u//dufw/4Lq8f+U7fP/q/H2/8L1+P/V+Pr/4vv8/+r8/f/v/f7/8v7+//P9
/v/y/P3/7/r7/+v3+f/o9fb/5vP0/+fx8v/p7/D/6u3t/+nr6v/k6Oj/3ubn/9Tj5f/H297/tszO/56x
sv+AjYv/YWVg/0ZDOv80LCL/LCEW/yofFP8tIhf/LyQa/y8lGv8vJRr/LyUa/y8lGv8vJRr/LyUa/y8l
Gv8vJRr/LyUa/y8lGv8vJRr/LyUa/y8lGv8vJRr/LyUa/zAlGv8wJRr/MCUa/y8mHP8tKSD/Kywl/ygw
K/8nNTH/KDk2/y4+Ov83Qj7/P0hC/0VPSf9FWVb/PmZn/zN1fP8rhZL/K5an/zipuv9Rvsz/b9Pd/4zm
6/+g8/b/qvn7/637+/+r+fr/p/b3/6L09v+a8vX/j+/z/4Xs8v986fH/dufw/3Pm7/9x5u//buTv/2ni
7v9h3+3/Vtvs/0rX6v9A0+n/ONDo/zTO5/8yzuf/MM3m/y3L5f8nyeP/HsXg/xPA3f8KvNv/A7nZ/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8BfZb/D4ef/yaYr/9CrsL/YMPW/33V5f+W4u//sOv1/8fx
+P/X9Pn/3fX5/9Xz+P/D7vb/rOjy/5Xi7/+A3e3/a9nr/1fV6v9H0un/PNHo/znR6P8/1On/SNfq/1Tb
7P9d3u3/Y+Dt/2ji7v9t5e//dOfw/3/p8f+O7PL/n+/0/7Hy9v/B9fj/z/j6/9v6+//m/P3/7v3+//P+
/v/1/f7/8/z8/+/6+//s+Pn/6vb3/+z19v/w9fX/8fPz/+3w7//i6ur/0ePm/7va3/+jzdP/jLvB/3eg
pP9hfn7/TVtV/z08Mv8xJxr/LB0P/ysbDf8sHQ//LiAS/y4gEv8uIBL/LiAS/y4gEv8uIBL/LiAS/y4g
Ev8uIBL/LiAS/y4gEv8uIBL/LiAS/y4gEv8uIBL/LiAS/y4gEf8vHxH/LiAS/y0jFv8qKB3/JC8o/x43
NP8cQUH/H0tN/ypVV/87YGD/TWxq/1x4dP9ig4H/X4+P/1eaoP9QprD/TrK//1bAzf9m0Nv/et/o/4zs
8v+Z9fn/n/n8/6H5/P+g9/n/nfT3/5ny9f+T8PT/i+7y/4Pr8f976fD/dOfw/27l7/9p4+7/Y+Dt/13e
7f9W2+z/Tdjr/0XV6v890un/Ns/o/zHN5v8sy+X/KMnk/yPH4v8cxOD/FcHe/w693P8Hutr/ArjY/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyV/wB8lP8Bfpf/CYaf/xWVrf8lpr7/OLnQ/0/J3/9s1un/kOLw/7Tr
9f/O8fj/2PP5/8rw9/+t6PL/id7t/2jV6P9S0Ob/Rc7l/z3O5v86z+f/ONDo/znR6P880un/QtTq/0nX
6v9Q2ev/WNzs/2Df7f9p4+7/c+bv/33p8P+G6/L/kO3z/5vv9P+n8fX/tfP3/8b2+f/X+fv/5vz9//H9
/v/1/f7/9f39//L7/P/w+vv/7/n6//L6+v/2+vr/9/n5//D19f/e6+3/wN7j/5vN1v93usX/W6Sw/0mL
lP89bXH/NlBO/zI2L/8uJRr/LB0Q/ysbDv8sHRD/LR8T/y0fE/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0f
E/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0fEv8uHhH/Lh8S/ywjF/8mKiL/HTUy/xVC
RP8RUFf/Fl9p/ydweP9Bgof/XJOV/3Sko/+AsK//grq6/37BxP94x83/dM7W/3bW3v983ub/g+bt/4ns
8/+O8fb/kPP4/5Hz9/+R8fb/kPD0/43u8/+K7fL/huzy/4Dr8f966fD/c+bv/2rj7v9h3+3/WNzs/1DZ
6/9K1+r/RdXq/0HT6f880en/Ns/n/y7M5v8nyeP/H8Xh/xfC3/8Rv93/DL3b/wi72v8Eudn/AbjY/wC4
2P8Audn/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB9lf8AgJj/BIef/weSrP8Mobv/FrDL/ye+2f9Fy+P/cNnr/53l
8v/A7fb/zPD3/7vr9P+U4e7/Z9Tn/z/K4v8qxd//JMTg/yfH4v8vy+X/Nc/n/zjQ6P860en/PNLp/z/T
6f9F1er/Tdjr/1nc7P9l4e7/cOXv/3jo8P996fH/gerx/4Xr8f+N7PL/m+70/7Dy9v/G9fn/2/n7/+v8
/f/y/f3/9f39//T9/f/y/Pz/8vz8//b9/f/5//7/+f79/+/4+f/X7O//r9rh/4DDz/9Tq7v/M5Ok/yR7
iv8iY2z/JkxO/y04NP8wKyP/MCUb/zAjGf8wJRv/MCce/zAnHv8wJx7/MCce/zAnHv8wJx7/MCce/zAn
Hv8wJx7/MCce/zAnHv8wJx7/MCce/zAnHv8wJx7/MCce/zEmHP8xJRv/MSUc/y8qIv8oMy//HUBC/xJQ
Wf8NYnD/E3WF/yiKmf9Ioaz/are9/4jKzP+Z19f/n9/e/57i4/+Z5Ob/leXo/5Hn6/+N6O7/ierw/4Xr
8f+D6/L/gezz/4Hs8v+B6/L/gevy/4Dq8f+A6vH/furx/3zp8f946PD/cOXv/2Xh7v9Z3Oz/Ttjr/0XV
6v9A0+n/PdLp/zzR6f850Oj/NM7n/yvL5P8hxuH/FsLe/w6+3P8Iu9r/BLrZ/wK52f8BuNj/AbjY/wC4
2f8Audr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCQq/8Anbn/AKrI/w231f8pxN//VtLn/4Xe
7v+q5/L/t+r0/6Tl8f972ur/S8zj/yPC3f8Pvdv/Db7c/xbC3/8kyOL/L8zl/zTO5/82z+f/Ns/o/zjQ
6P890un/RtXq/1La6/9f3+3/auPu/3Hl7/9z5u//cubv/3Pm7/945/D/hunx/5zt9P+18vf/zfb5/9/5
+//q+/z/7/z9//L9/f/y/f3/8/39//X////3////8////+f6+//N7fD/o9nh/3LBzv9FqLn/JpGk/xt8
jP8eaXP/KFda/zRIRf86PTf/PDkx/z04L/88OTH/PDoz/zw7M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7
M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7M/88OzP/PDoz/zw5Mf89ODD/PTkx/zo9N/8zR0T/KFVY/x1l
cP8XeIj/HYye/zKhsv9Sucb/ddDY/5Pj5v+l7/D/rPX1/6329v+q9fX/pfP0/5/y9P+W7/P/jO3y/4Pr
8f986fD/eOjw/3bn8P915/D/dOfw/3Tm8P905/D/defw/3Tn8P9x5e//auPu/1/f7f9S2uv/RtXq/z3S
6f840Oj/Ns/o/zbP5/80zuf/L8zl/ybI4/8bw+D/EL/d/we72v8Cudj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCPq/8Am7j/AKjH/wa00/8dv9z/Qsvk/2nW
6f+I3u3/k+Du/4Pc7P9h0ub/Ocbg/xe92/8Hudn/B7ra/w++3f8bxOD/Jsjj/yvL5P8uzOb/Mc3m/zTO
5/850ej/QtTp/0zY6/9X3Oz/YN/t/2bh7v9m4u7/Y+Ht/2Lh7f9n4u7/c+Tv/4jo8v+h7fT/ufL3/8z2
+f/a+fv/5fv8/+39/f/y/v7/8/7+//L////t////5P3+/9X4+v+97fH/mtzk/3LI1P9Ps8L/NqCw/y+Q
nv80gYr/P3R3/0ppZ/9RYVz/VF5X/1RdVv9UXlf/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1Nf
Wf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NeV/9UXVb/VF1X/1FhXP9Mamj/QnZ5/ziE
jf8zlKL/OKW1/0i3x/9hy9f/fd7m/5Tu8v+j+Pr/qvz9/6z8/f+q+vv/pvf5/6D19/+X8vX/jO/0/4Hr
8v956PD/c+bv/27l7/9r4+7/aOLu/2bh7v9m4u7/Z+Lu/2ji7v9m4e7/YN/t/1fc7P9M2Ov/QtTp/znR
6P80zuf/Mc3m/y7M5v8ry+T/Jsjj/x7F4P8Vwd7/DL3b/wS52f8AuNj/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8Am7n/AKfH/wSz0v8UvNr/LsXg/0rN
5f9f0uf/Z9Tn/1zR5v9EyuL/KMHd/xC72f8FuNj/BLnZ/wq82/8TwN3/G8Pg/yHG4f8nyeP/LMvl/zLO
5/840Oj/P9Pp/0fW6v9O2Ov/VNvs/1jc7P9X3Oz/VNzs/1Tb7P9X3Oz/Y9/t/3Xj7/+K6fL/oe70/7Xy
9//H9vn/2Pn7/+b8/P/w/f7/8v7+/+z+/v/g/P7/0Pn8/770+P+r7PH/k+Ho/3vT3f9mxtH/WLnF/1Sv
uP9ZpKv/YZue/2qUk/9vj4v/cY2I/3GMh/9xjYj/cI2J/3COif9wjon/cI6J/3COif9wjon/cI6J/3CO
if9wjon/cI6J/3COif9wjon/cI6J/3COif9wjon/cI2J/3GNiP9xjIf/cYyI/2+Pi/9rlZT/ZJ6g/16p
r/9atL7/W8DL/2TM2P9z2eP/gubt/5Dw9f+Z9vr/nfn8/5/5/P+e9/r/nPX4/5jz9/+R8fX/ie7z/4Dr
8v946PD/cOXv/2ni7v9h4O3/XN7s/1jc7P9X3Oz/WNzs/1nc7P9Y3Oz/VNvs/07Y6/9H1ur/P9Pp/zjQ
6P8yzuf/LMvl/yfJ4/8hxuH/G8Pg/xTB3v8Ovtz/CLva/wO52P8At9j/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wKz0/8Lutr/GsDe/ynF
4P82x+H/Osjh/zTG4P8mwt3/Fr3b/wm52f8DuNj/ArjY/wW62f8KvNv/EL/c/xbC3v8fxeH/KMnk/zDN
5v830Oj/PdLp/0LU6v9F1er/SNbq/0rX6v9J1+r/R9bq/0fW6v9K1+r/VNrr/2Pe7f915O//ieny/5zu
9P+x8vb/x/b5/9z6+//p/P3/7Pz9/+L7/P/P+Pv/ufT4/6bw9f+Y6/H/jubt/4bg5/+A2uH/fdTb/33P
1P+Ayc3/hcTF/4nAv/+Mvbv/jby5/427uf+NvLn/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428
uv+NvLr/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428uf+Nu7j/jby5/4y9u/+KwcD/h8bH/4PM
z/+A0tf/f9jf/4De5f+D5Ov/hunw/4nt8/+L8Pb/jPH3/43x9v+O8fb/jfD1/4vv9P+H7vP/g+zy/37q
8f936PD/buTv/2Th7f9Z3ez/UNnr/0vX6v9J1ur/Sdbq/0rX6v9K1+r/SNbq/0XV6v9C1Or/PdLp/zfQ
6P8wzeb/KMnk/x/F4f8Wwt7/EL/d/wu92/8Hu9r/BLnZ/wK42P8AuNj/ALfY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbr/AKrI/wG00/8Eudn/Cr3c/w++
3P8Uvtz/Fb7b/xO92/8OvNr/CLrZ/wO52P8BuNj/ALjY/wG42P8Dudn/B7va/w6+3P8Xwt//I8fi/y3L
5f81z+f/OdHo/zzS6f890un/PtLp/z/S6f8+0un/PdLp/z3S6f9A0+n/SNbq/1Ta6/9i3+3/c+Tv/4Xp
8f+b7vT/tfL3/8z2+f/d+fv/4Pn7/9T3+v+99Pj/pfD1/5Hs8/+J6/H/ierw/47q7/+V6+7/murt/53p
6/+f5+j/oOXl/6Dj4/+h4uH/oeHg/6Hh4P+h4eD/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh
4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4P+h4eD/oeHg/6Hi4f+h4+P/oOXl/5/n
6P+d6ev/muvt/5Xr7/+P6/D/iOvx/4Lq8f9/6vH/ferx/33q8f996vH/ferx/33p8f986fH/e+nx/3no
8P905u//a+Pu/1/e7f9S2uv/R9bq/0DT6f890un/PdLp/z7S6f8/0un/PtLp/z3S6f880un/OdHo/zXP
5/8ty+X/I8fi/xfC3/8Ovtz/B7va/wO52f8Budj/AbjY/wG42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wG6
2v8Budn/AbjY/wG42P8BuNj/ALjY/wC42P8AuNj/ALjY/wC32P8AuNj/ArnY/wi72v8Rv93/HMTg/yfJ
4/8uzOX/M87n/zbP5/830Oj/ONDo/zjQ6P840Oj/N9Do/zfQ6P860ej/QNPp/0nX6v9V2+z/YuDt/3Ll
7/+H6fL/n+30/7bx9//H9Pj/y/T5/8Dz+P+r7/X/lOzz/4Tq8f+A6vH/hezy/5Dv8/+c8vX/pfT2/6j1
9v+q9vb/qfX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j1
9v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qfX2/6r2
9v+o9fb/pfT2/53y9f+T8PT/iO3y/3/q8f946PD/defw/3Lm7/9x5e//cOXv/3Dl7/9x5e//ceXv/3Dl
7/9s5O//ZODu/1jc7P9L1+r/QdPp/zrR6P830Oj/N9Do/zjQ6P840Oj/ONDo/zfQ6P82z+f/M87n/y7M
5f8nyeP/HMTg/xG/3f8Iu9r/ArnY/wC42P8At9j/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC4
2f8At9j/ALbX/wC21/8At9f/ALfY/wC42P8AuNj/ALjY/wC31/8At9f/AbjY/wa62f8Nvdv/FcHe/x7F
4P8lyOL/Ksrk/y7M5f8yzuf/Nc/n/zfQ6P830Oj/Ns/o/zbP6P840Oj/PdLp/0PV6v9M2ev/Vtzs/2Lg
7f9y4+//hubx/5jp8/+m6/X/q+31/6Ts9P+W6/P/h+nx/33p8f986vH/g+3y/47w9P+Z9Pf/ovb4/6X4
+v+m+fv/pfr8/6T6/P+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6
/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+k+vz/pfr8/6b5
+/+l+Pr/ovb4/5v09/+S8fX/h+3z/37q8f925/D/cOXv/2rj7v9m4e7/Y+Dt/2Lg7f9j4O3/ZOHu/2Th
7v9h4O3/W93t/1HZ6/9H1ur/PtLp/zjQ6P82z+j/Ns/o/zfQ6P830Oj/Nc/n/zLO5/8uzOX/Ksrk/yXI
4v8exeD/FcHe/w292/8Gutn/AbjY/wC31/8At9f/ALfY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC4
2f8At9j/ALbX/wC21/8At9f/ALfY/wC42P8AuNj/ALjY/wC32P8At9f/AbjY/wS52f8Iu9r/Db3c/xPA
3f8Zw9//IMbh/yfJ4/8uzOX/NM7n/zfQ6P840On/ONDp/zjQ6P850Oj/PNLp/0DU6f9F1ur/TNjr/1Tb
7P9e3e3/at/u/3fg7/+A4vD/huTx/4Xl8f+B5vH/fOfw/3no8P976vH/gezy/4nv9P+R8fX/lvP3/5n0
+P+Z9fn/mfb5/5j2+v+X9vv/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3
+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f2+/+Y9vr/mfb5/5n1
+f+Z9Pj/l/P3/5Lx9f+M7/T/hO3y/33q8f915/D/bOTu/2Th7f9c3uz/Vtvs/1Pa6/9T2uz/Vdvs/1bb
7P9U2+z/UNnr/0nX6/9D1Or/PNLp/znQ6P840Oj/ONDp/zjQ6f830Oj/NM7n/y7M5f8nyeP/IMbh/xnD
3/8TwN3/Db3c/wi72v8Eudn/AbjY/wC31/8At9f/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2v8AuNj/ALfY/wC32P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK42P8Dudn/Brra/wm8
2/8Pvtz/FsLe/yDG4f8qyuT/Ms3m/zfQ6P850en/OdHp/znQ6P850Oj/OtHo/zzS6f8/0+n/Q9Tq/0fW
6v9M1uv/Udfr/1fY7P9d2ez/Ytvt/2je7v9t4e7/ceTv/3bn8P966fD/furx/4Ls8v+F7fP/h+3z/4ju
9P+J7vT/iO/0/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv
9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/0/4nu
9P+I7vT/h+3z/4Xt8/+D7PL/f+vx/3rp8P9z5u//aePu/17e7f9T2uv/Stfq/0bV6v9F1er/RtXq/0fW
6v9H1ur/RNXq/0HT6f8+0un/O9Hp/znQ6P850Oj/OdHp/znR6f830Oj/Ms3m/yrK5P8gxuH/FsLe/w++
3P8JvNv/Brra/wO52f8CuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK5
2f8Gu9r/Dr7c/xnD3/8kyOL/Lszl/zTO5/83z+j/N9Do/zbP6P82z+f/Ns/n/zfP5/830Oj/OdDo/zrR
6P870ej/PdHo/z/R6f9C0un/SNXq/1HY6/9c3ez/Z+Hu/3Dl7/915/D/eOjw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eOjw/3Xn8P9v5e//ZeHu/1jc7P9L1+r/QdPp/zzR6P850Oj/OdDo/zrQ
6P860Oj/OdDo/zjQ6P83z+f/Ns/n/zbP5/82z+j/N9Do/zfP6P80zuf/Lszl/yTI4v8Zw9//Dr7c/wa7
2v8Cudn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALvb/wC6
2v8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC42f8AuNj/ALjY/wC4
2P8Dudn/Crzb/xPB3v8exeH/J8nk/yzM5f8vzeb/L83m/y7M5v8tzOb/Lczm/y3M5f8tzOX/Lczl/y3M
5v8uzOb/L83n/zHO5/81z+j/O9Lp/0XW6v9R2uz/Xd/t/2fi7/9s5O//buXv/27l7/9t5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/23k7/9u5e//buXv/2zk7/9n4u//Xd/t/1La7P9G1ur/PNLp/zbQ6P8yzuf/MM3n/y7M
5v8tzOb/Lczl/yzM5f8tzOX/Lczm/y3M5v8uzOb/L83m/y/N5v8szOX/J8nk/x7F4f8Twd7/Crzb/wO5
2f8AuNj/ALjY/wC42P8AuNn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC5
2f8Autr/ALvb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrv/AKvJ/wC11P8Autr/ALzc/wC7
3P8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC52v8Audn/ALnZ/wC5
2f8Cutr/B7zb/w6/3v8Ww+D/Hcbi/yHI4/8jyOT/I8nk/yLI5P8iyOP/Icjj/yDI4/8gx+P/H8fj/yDI
5P8jyeT/Jsvm/yrN5/8wz+n/NtLq/z/V6/9K2ez/U9zu/1vf7/9g4e//YeHv/2Dh7/9f4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/1/g7/9g4e//YeHv/2Dh7/9c3+//Vd3u/0zZ7f9D1uz/OtPq/zPQ6f8tzef/KMvm/yTJ
5P8hyOT/H8fj/x/H4/8gx+P/Icjj/yLI4/8iyOT/I8nk/yPI5P8hyOP/Hcbi/xbD4P8Ov97/B7zb/wK6
2v8Audn/ALnZ/wC52f8Audr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC6
2v8Au9z/ALzc/wC62v8AtdT/AKvJ/wCeu/8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCSrP8An7v/AKvK/wC11f8Autv/ALzd/wC8
3P8Au9v/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALna/wC5
2v8Butr/BLvb/wm93f8OwN7/EsHf/xTD4P8Vw+D/FsPg/xXD4P8Vw+D/FMPg/xPC4P8TwuD/E8Lg/xXD
4f8axeL/IMjk/yjM5v8wz+n/N9Lq/z7V6/9E1+z/Stnt/0/b7f9R3O7/Utzu/1Lc7v9R3O7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Hc7v9S3O7/Utzu/1Hc7v9P2+3/S9nt/0bX7f9A1ez/OdPr/zLQ6f8qzOf/Isnk/xrF
4v8Vw+H/E8Lg/xLC4P8TwuD/FMPg/xXD4P8Vw+D/FsPg/xXD4P8Uw+D/EsHf/w7A3v8Jvd3/BLvb/wG6
2v8Audr/ALna/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC7
2/8AvNz/ALzd/wC62/8AtdX/AKvK/wCfu/8Akqz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALrb/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC4
2P8BuNj/ArnZ/wS62f8Gu9r/CLzb/wm82/8Kvdv/Cr3b/wq82/8JvNv/Cbzb/wi82/8HvNv/CLzb/wu9
3P8SwN7/HMTh/ybJ5P8wzeb/N9Do/zvS6f8/0+r/QdTq/0LU6v9D1er/Q9Xq/0PV6v9D1er/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PV6v9D1er/Q9Xq/0PV6v9C1Or/QdTq/z/T6v880un/ONDo/zDN5v8nyeT/HMTh/xLA
3v8Lvdz/CLzb/we82/8IvNv/Cbzb/wm82/8KvNv/Cr3b/wq92/8JvNv/CLzb/wa72v8Eutn/ArnZ/wG4
2P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALrb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQqv8Am7f/AKfE/wCvzv8AtNP/ALXV/wC1
1P8AtNP/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz
0/8As9P/ALTT/wG00/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8As9P/AbTT/wS1
1P8Mudb/Fr3Z/yLC3P8sxt//Msnh/zXK4v82y+L/Nsri/zXK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v81yuL/Nsri/zbL4v81yuL/Msnh/yzG3/8iwtz/Fr3Z/wy5
1v8EtdT/AbTT/wCz0/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8BtNP/ALTT/wCz
0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wC0
0/8AtdT/ALXV/wC00/8Ar87/AKfE/wCbt/8AkKr/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH+W/wB/lv8AgJj/AIWe/wCNp/8AlrH/AJ+8/wCnxP8Aqsj/AKvK/wCr
yf8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKnI/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnH/wCpx/8Aqcf/AKnH/wKq
yP8Ircr/EbHN/xu10P8judL/KbvU/yu81P8rvNT/KrzU/ym71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8pu9T/KrzU/yu81P8rvNT/KbvU/yO50v8btdD/EbHN/wit
yv8Cqsj/AKnH/wCpx/8Aqcf/AKnH/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aq8n/AKvK/wCqyP8Ap8T/AJ+8/wCWsf8Ajaf/AIWe/wCAmP8Af5b/AH+W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIOc/wCJov8AkKr/AJax/wCbt/8Anrr/AJ+7/wCe
u/8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrr/AJ26/wCduv8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCcuf8AnLn/AJ25/wKd
uv8GoLv/DKK9/xOlv/8ZqMH/HarC/x6qwv8eqsL/HarC/xyqwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8cqsL/HarC/x6qwv8eqsL/HarC/xmowf8Tpb//DKK9/wag
u/8Cnbr/AJ25/wCcuf8AnLn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbr/AJ26/wCe
uv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrv/AJ+7/wCeuv8Am7f/AJax/wCQqv8AiaL/AIOc/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIKa/wCFnv8AiaL/AI2n/wCQqv8Akaz/AJKs/wCR
rP8Akaz/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wGR
q/8Dkqz/B5St/wuVrv8Ol6//EJiw/xGYsP8RmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xGYsP8RmLD/EJiw/w6Xr/8Lla7/B5St/wOS
rP8Bkav/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
rP8Akaz/AJKs/wCRrP8AkKr/AI2n/wCJov8AhZ7/AIKa/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj7AICY/ACAmPwAgJj8AICY/QCAmP4AgJj/AIGZ/wCCmv8Ag5z/AIWe/wCGn/8Ah5//AIeg/wCH
oP8Ah6D/AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
n/8Ah5//AIef/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCH
oP8Bh6D/A4ig/wSIof8FiaH/Bomh/weJof8HiaH/B4mh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/B4mh/weJof8HiaH/Bomh/wWJof8EiKH/A4ig/wGH
oP8Ah6D/AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIef/wCH
n/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
oP8Ah6D/AIeg/wCHn/8Ahp//AIWe/wCDnP8Agpr/AIGZ/wCAmP8AgJj+AICY/QCAmPwAgJj8AICY/ACA
mPsAgJjcAICY3gCAmOEAgJjmAICY7QCAmPQAgJj7AICY/wCAmP8AgJj/AICY/wCAmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCAmf8AgJn/AICZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AICZ/wCAmf8AgJn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgJn/AICY/wCAmP8AgJj/AICY/wCAmPsAgJj0AICY7QCAmOYAgJjhAICY3gCA
mNwAgJimAICYqgCAmLEAgJi+AICY0ACAmOMAgJj0AICY/gB/l/8Af5f/AH+W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+W/wB/l/8Af5f/AICY/gCAmPQAgJjjAICY0ACAmL4AgJixAICYqgCA
mKYAgJhoAICYbwCAmHsAgJiSAICYrwCAmNAAgJjtAICY/QB/l/8Af5f/AH+X/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+X/wB/l/8Af5f/AICY/QCAmO0AgJjQAICYrwCAmJIAgJh7AICYbwCA
mGgAgJgwAICYOQCAmEoAgJhpAICYkgCAmL4AgJjmAICY/ACAmP8AgJj/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wCAmP8AgJj/AICY/ACAmOYAgJi+AICYkgCAmGkAgJhKAICYOQCA
mDAAgJgGAICYEQCAmCYAgJhKAICYewCAmLEAgJjhAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmOEAgJixAICYewCAmEoAgJgmAICYEQCA
mAYAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mADAAAAAAAAAAAAAAAAAAAAAAAAMAMAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAwAwAAAAAAAAAAAAAAAAAAAAAAA
DAA=
================================================
FILE: DS_Map/EvolutionsEditor.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;
namespace DSPRE {
public partial class EvolutionsEditor : Form {
private readonly string[] fileNames;
private PokemonEditor _parent;
private readonly string[] pokeNames;
private readonly string[] moveNames;
private readonly string[] itemNames;
private int currentLoadedId = 0;
private EvolutionFile currentLoadedFile = null;
private static bool dirty = false;
private static readonly string formName = "Evolutions Editor";
private (ComboBox m, Label l, NumericUpDown p, ComboBox t)[] evoRows;
public EvolutionsEditor(Control parent, PokemonEditor pokeEditor) {
this._parent = pokeEditor;
this.pokeNames = RomInfo.GetPokemonNames();
this.moveNames = RomInfo.GetAttackNames();
this.itemNames = RomInfo.GetItemNames();
int count = RomInfo.GetEvolutionFilesCount();
List fileNames = new List(count);
fileNames.AddRange(pokeNames);
this.fileNames = fileNames.ToArray();
InitializeComponent();
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Size = parent.Size;
this.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
Helpers.DisableHandlers();
evoRows = new (ComboBox m, Label l, NumericUpDown p, ComboBox t)[EvolutionFile.numEvolutions] {
(evoMethodComboBox1, descLabel1, evoParamUpDown1, evoTargetMonComboBox1),
(evoMethodComboBox2, descLabel2, evoParamUpDown2, evoTargetMonComboBox2),
(evoMethodComboBox3, descLabel3, evoParamUpDown3, evoTargetMonComboBox3),
(evoMethodComboBox4, descLabel4, evoParamUpDown4, evoTargetMonComboBox4),
(evoMethodComboBox5, descLabel5, evoParamUpDown5, evoTargetMonComboBox5),
(evoMethodComboBox6, descLabel6, evoParamUpDown6, evoTargetMonComboBox6),
(evoMethodComboBox7, descLabel7, evoParamUpDown7, evoTargetMonComboBox7),
};
BindingList listMons = new BindingList(fileNames);
// Create as many rows as there are evolution types
for (int i = 0; i < EvolutionFile.numEvolutions; i++) {
//Create a binding source for the combobox in the first column
evoRows[i].m.DataSource = new BindingSource(Enum.GetNames(typeof(EvolutionMethod)), string.Empty);
evoRows[i].t.DataSource = new BindingSource(listMons, string.Empty);
}
monNumberNumericUpDown.Maximum = fileNames.Count - 1;
pokemonNameInputComboBox.Items.AddRange(this.fileNames);
Helpers.EnableHandlers();
pokemonNameInputComboBox.SelectedIndex = 1;
}
private void pokemonNameInputComboBox_SelectedIndexChanged(object sender, EventArgs e) {
Update();
if (Helpers.HandlersDisabled) {
return;
}
this._parent.TrySyncIndices((ComboBox)sender);
Helpers.DisableHandlers();
if (CheckDiscardChanges()) {
int newNumber = pokemonNameInputComboBox.SelectedIndex;
monNumberNumericUpDown.Value = newNumber;
ChangeLoadedFile(newNumber);
}
Helpers.EnableHandlers();
}
private void monNumberNumericUpDown_ValueChanged(object sender, EventArgs e) {
Update();
if (Helpers.HandlersDisabled) {
return;
}
this._parent.TrySyncIndices((NumericUpDown)sender);
Helpers.DisableHandlers();
if (CheckDiscardChanges()) {
int newNumber = (int)monNumberNumericUpDown.Value;
pokemonNameInputComboBox.SelectedIndex = newNumber;
ChangeLoadedFile(newNumber);
}
Helpers.EnableHandlers();
}
public void ChangeLoadedFile(int toLoad) {
currentLoadedId = toLoad;
currentLoadedFile = new EvolutionFile(currentLoadedId);
for (int i = 0; i < EvolutionFile.numEvolutions; i++) {
(ComboBox m, Label l, NumericUpDown p, ComboBox t) = evoRows[i];
ref EvolutionData data = ref currentLoadedFile.data[i];
if (data.isValid()) {
m.SelectedIndex = (int)data.method;
p.Value = data.param;
t.SelectedIndex = data.target;
} else {
m.SelectedIndex = -1;
p.Value = 0;
t.SelectedIndex = -1;
}
}
pokemonPictureBox.Image = currentLoadedId > 0 ? DSUtils.GetPokePic(currentLoadedId, pokemonPictureBox.Width, pokemonPictureBox.Height) : Properties.Resources.IconPokeball;
setDirty(false);
}
private void saveDataButton_Click(object sender, EventArgs e) {
//Build a new EvolutionFile from the current GUI state
EvolutionFile newFile = new EvolutionFile();
List data = new List();
for (int i = 0; i < EvolutionFile.numEvolutions; i++) {
EvolutionData ed = EvolutionDataFromGUI(i);
if (ed.isValid()) {
data.Add(ed);
}
}
newFile.data = data.ToArray();
newFile.SaveToFileDefaultDir(currentLoadedId, true);
currentLoadedFile = newFile;
setDirty(false);
}
private EvolutionData EvolutionDataFromGUI(int i) {
(ComboBox m, Label l, NumericUpDown p, ComboBox t) = evoRows[i];
//Retrieve evo method from enum
EvolutionMethod method = (EvolutionMethod)m.SelectedIndex;
short param = (short)p.Value;
short target = (short)t.SelectedIndex;
EvolutionData ed = new EvolutionData() {
method = method,
param = param,
target = target
};
return ed;
}
public bool CheckDiscardChanges() {
if (!dirty) {
return true;
}
DialogResult res = MessageBox.Show("Evolutions Editor\nThere are unsaved changes to the current Evolution data.\nDiscard and proceed?", "Evolutions Editor - Unsaved changes", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (res.Equals(DialogResult.Yes)) {
return true;
}
monNumberNumericUpDown.Value = currentLoadedId;
pokemonNameInputComboBox.SelectedIndex = currentLoadedId;
return false;
}
private void setDirty(bool status) {
if (status) {
dirty = true;
this.Text = formName + "*";
} else {
dirty = false;
this.Text = formName;
}
}
private void evoMethodComboBox1_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(0);
}
private void evoMethodComboBox2_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(1);
}
private void evoMethodComboBox3_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(2);
}
private void evoMethodComboBox4_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(3);
}
private void evoMethodComboBox5_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(4);
}
private void evoMethodComboBox6_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(5);
}
private void evoMethodComboBox7_SelectedIndexChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(6);
}
private void ResetGUIRow(int index) {
//Reset GUI row
(ComboBox m, Label l, NumericUpDown p, ComboBox t) = evoRows[index];
l.Text = "";
p.Enabled = false;
t.Enabled = false;
p.Value = 0;
}
private void UpdateDescriptionLabel(int index) {
if (index < 0 || index >= evoRows.Length) {
throw new ArgumentOutOfRangeException("Index out of range: " + index);
}
(ComboBox m, Label l, NumericUpDown p, ComboBox t) = evoRows[index];
if (m.SelectedIndex <= (int)EvolutionMethod.None) {
ResetGUIRow(index);
return;
}
if ( m.SelectedIndex > Enum.GetValues(typeof(EvolutionMethod)).Length){
MessageBox.Show("Invalid evolution method selected", "Evolution method error", MessageBoxButtons.OK, MessageBoxIcon.Error);
ResetGUIRow(index);
return;
}
Helpers.DisableHandlers();
EvolutionMethod method = (EvolutionMethod)m.SelectedIndex;
EvolutionParamMeaning type = EvolutionFile.evoDescriptions[method];
switch (type) {
case EvolutionParamMeaning.Ignored:
l.Text = "";
p.Enabled = false;
t.Enabled = true;
if (p.Value != 0) {
Console.WriteLine("Warning: Evolution parameter is not 0, but it should be.");
}
p.Value = 0;
break;
case EvolutionParamMeaning.FromLevel:
l.Text = "From Level: ";
p.Enabled = true;
t.Enabled = true;
p.Maximum = 100;
break;
case EvolutionParamMeaning.ItemName:
l.Text = $"({itemNames[(int)p.Value]})";
p.Enabled = true;
t.Enabled = true;
p.Maximum = itemNames.Length - 1;
break;
case EvolutionParamMeaning.MoveName:
l.Text = $"({moveNames[(int)p.Value]})";
p.Enabled = true;
t.Enabled = true;
p.Maximum = moveNames.Length - 1;
break;
case EvolutionParamMeaning.PokemonName:
l.Text = $"({pokeNames[(int)p.Value]})";
p.Enabled = true;
t.Enabled = true;
p.Maximum = pokeNames.Length - 1;
break;
case EvolutionParamMeaning.BeautyValue:
l.Text = "Beauty >=";
p.Enabled = true;
t.Enabled = true;
p.Maximum = 255;
break;
default:
throw new Exception("Unknown evolution parameter type: " + type);
}
Helpers.EnableHandlers();
}
private void evoParamUpDown1_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(0);
}
private void evoParamUpDown2_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(1);
}
private void evoParamUpDown3_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(2);
}
private void evoParamUpDown4_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(3);
}
private void evoParamUpDown5_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(4);
}
private void evoParamUpDown6_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(5);
}
private void evoParamUpDown7_ValueChanged(object sender, EventArgs e) {
UpdateDescriptionLabel(6);
}
}
}
================================================
FILE: DS_Map/EvolutionsEditor.designer.cs
================================================
namespace DSPRE {
partial class EvolutionsEditor {
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EvolutionsEditor));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.saveDataButton = new System.Windows.Forms.Button();
this.pokemonPictureBox = new System.Windows.Forms.PictureBox();
this.monNumberNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.pokemonNameInputComboBox = new DSPRE.InputComboBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.label2 = new System.Windows.Forms.Label();
this.paramLabel = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.evoMethodComboBox1 = new DSPRE.InputComboBox();
this.evoMethodComboBox2 = new DSPRE.InputComboBox();
this.evoMethodComboBox3 = new DSPRE.InputComboBox();
this.evoMethodComboBox4 = new DSPRE.InputComboBox();
this.evoMethodComboBox5 = new DSPRE.InputComboBox();
this.evoMethodComboBox6 = new DSPRE.InputComboBox();
this.evoMethodComboBox7 = new DSPRE.InputComboBox();
this.evoParamUpDown1 = new System.Windows.Forms.NumericUpDown();
this.evoParamUpDown2 = new System.Windows.Forms.NumericUpDown();
this.evoParamUpDown3 = new System.Windows.Forms.NumericUpDown();
this.evoParamUpDown4 = new System.Windows.Forms.NumericUpDown();
this.evoParamUpDown5 = new System.Windows.Forms.NumericUpDown();
this.evoParamUpDown6 = new System.Windows.Forms.NumericUpDown();
this.evoParamUpDown7 = new System.Windows.Forms.NumericUpDown();
this.evoTargetMonComboBox1 = new DSPRE.InputComboBox();
this.evoTargetMonComboBox2 = new DSPRE.InputComboBox();
this.evoTargetMonComboBox3 = new DSPRE.InputComboBox();
this.evoTargetMonComboBox4 = new DSPRE.InputComboBox();
this.evoTargetMonComboBox5 = new DSPRE.InputComboBox();
this.evoTargetMonComboBox6 = new DSPRE.InputComboBox();
this.evoTargetMonComboBox7 = new DSPRE.InputComboBox();
this.descLabel1 = new System.Windows.Forms.Label();
this.descLabel2 = new System.Windows.Forms.Label();
this.descLabel3 = new System.Windows.Forms.Label();
this.descLabel4 = new System.Windows.Forms.Label();
this.descLabel5 = new System.Windows.Forms.Label();
this.descLabel6 = new System.Windows.Forms.Label();
this.descLabel7 = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pokemonPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.monNumberNumericUpDown)).BeginInit();
this.tableLayoutPanel2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown5)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown6)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown7)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 4;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10.41322F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.49587F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 18.97891F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10.43285F));
this.tableLayoutPanel1.Controls.Add(this.saveDataButton, 3, 0);
this.tableLayoutPanel1.Controls.Add(this.pokemonPictureBox, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.monNumberNumericUpDown, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.pokemonNameInputComboBox, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 17.13396F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 82.86604F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(576, 321);
this.tableLayoutPanel1.TabIndex = 1;
//
// saveDataButton
//
this.saveDataButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.saveDataButton.Image = ((System.Drawing.Image)(resources.GetObject("saveDataButton.Image")));
this.saveDataButton.Location = new System.Drawing.Point(517, 3);
this.saveDataButton.Name = "saveDataButton";
this.saveDataButton.Size = new System.Drawing.Size(56, 49);
this.saveDataButton.TabIndex = 30;
this.saveDataButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.saveDataButton.UseVisualStyleBackColor = true;
this.saveDataButton.Click += new System.EventHandler(this.saveDataButton_Click);
//
// pokemonPictureBox
//
this.pokemonPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.pokemonPictureBox.Location = new System.Drawing.Point(3, 3);
this.pokemonPictureBox.Name = "pokemonPictureBox";
this.pokemonPictureBox.Size = new System.Drawing.Size(53, 49);
this.pokemonPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.pokemonPictureBox.TabIndex = 12;
this.pokemonPictureBox.TabStop = false;
//
// monNumberNumericUpDown
//
this.monNumberNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.monNumberNumericUpDown.Location = new System.Drawing.Point(409, 17);
this.monNumberNumericUpDown.Name = "monNumberNumericUpDown";
this.monNumberNumericUpDown.Size = new System.Drawing.Size(102, 20);
this.monNumberNumericUpDown.TabIndex = 16;
this.monNumberNumericUpDown.ValueChanged += new System.EventHandler(this.monNumberNumericUpDown_ValueChanged);
//
// pokemonNameInputComboBox
//
this.pokemonNameInputComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.pokemonNameInputComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.pokemonNameInputComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.pokemonNameInputComboBox.FormattingEnabled = true;
this.pokemonNameInputComboBox.Location = new System.Drawing.Point(62, 17);
this.pokemonNameInputComboBox.Name = "pokemonNameInputComboBox";
this.pokemonNameInputComboBox.Size = new System.Drawing.Size(341, 21);
this.pokemonNameInputComboBox.TabIndex = 31;
this.pokemonNameInputComboBox.SelectedIndexChanged += new System.EventHandler(this.pokemonNameInputComboBox_SelectedIndexChanged);
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 4;
this.tableLayoutPanel1.SetColumnSpan(this.tableLayoutPanel2, 4);
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 40F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 89F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.5074F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 39.7463F));
this.tableLayoutPanel2.Controls.Add(this.label2, 3, 0);
this.tableLayoutPanel2.Controls.Add(this.paramLabel, 2, 0);
this.tableLayoutPanel2.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox1, 0, 1);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox2, 0, 2);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox3, 0, 3);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox4, 0, 4);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox5, 0, 5);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox6, 0, 6);
this.tableLayoutPanel2.Controls.Add(this.evoMethodComboBox7, 0, 7);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown1, 2, 1);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown2, 2, 2);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown3, 2, 3);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown4, 2, 4);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown5, 2, 5);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown6, 2, 6);
this.tableLayoutPanel2.Controls.Add(this.evoParamUpDown7, 2, 7);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox1, 3, 1);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox2, 3, 2);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox3, 3, 3);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox4, 3, 4);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox5, 3, 5);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox6, 3, 6);
this.tableLayoutPanel2.Controls.Add(this.evoTargetMonComboBox7, 3, 7);
this.tableLayoutPanel2.Controls.Add(this.descLabel1, 1, 1);
this.tableLayoutPanel2.Controls.Add(this.descLabel2, 1, 2);
this.tableLayoutPanel2.Controls.Add(this.descLabel3, 1, 3);
this.tableLayoutPanel2.Controls.Add(this.descLabel4, 1, 4);
this.tableLayoutPanel2.Controls.Add(this.descLabel5, 1, 5);
this.tableLayoutPanel2.Controls.Add(this.descLabel6, 1, 6);
this.tableLayoutPanel2.Controls.Add(this.descLabel7, 1, 7);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 58);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.Padding = new System.Windows.Forms.Padding(4);
this.tableLayoutPanel2.RowCount = 8;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(570, 260);
this.tableLayoutPanel2.TabIndex = 32;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(380, 4);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(62, 13);
this.label2.TabIndex = 2;
this.label2.Text = "Target Mon";
//
// paramLabel
//
this.paramLabel.AutoSize = true;
this.paramLabel.Location = new System.Drawing.Point(284, 4);
this.paramLabel.Name = "paramLabel";
this.paramLabel.Size = new System.Drawing.Size(55, 13);
this.paramLabel.TabIndex = 1;
this.paramLabel.Text = "Parameter";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(7, 4);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(90, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Evolution Method";
//
// evoMethodComboBox1
//
this.evoMethodComboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox1.FormattingEnabled = true;
this.evoMethodComboBox1.Location = new System.Drawing.Point(7, 30);
this.evoMethodComboBox1.Name = "evoMethodComboBox1";
this.evoMethodComboBox1.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox1.TabIndex = 3;
this.evoMethodComboBox1.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox1_SelectedIndexChanged);
//
// evoMethodComboBox2
//
this.evoMethodComboBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox2.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox2.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox2.FormattingEnabled = true;
this.evoMethodComboBox2.Location = new System.Drawing.Point(7, 63);
this.evoMethodComboBox2.Name = "evoMethodComboBox2";
this.evoMethodComboBox2.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox2.TabIndex = 4;
this.evoMethodComboBox2.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox2_SelectedIndexChanged);
//
// evoMethodComboBox3
//
this.evoMethodComboBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox3.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox3.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox3.FormattingEnabled = true;
this.evoMethodComboBox3.Location = new System.Drawing.Point(7, 96);
this.evoMethodComboBox3.Name = "evoMethodComboBox3";
this.evoMethodComboBox3.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox3.TabIndex = 5;
this.evoMethodComboBox3.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox3_SelectedIndexChanged);
//
// evoMethodComboBox4
//
this.evoMethodComboBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox4.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox4.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox4.FormattingEnabled = true;
this.evoMethodComboBox4.Location = new System.Drawing.Point(7, 129);
this.evoMethodComboBox4.Name = "evoMethodComboBox4";
this.evoMethodComboBox4.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox4.TabIndex = 6;
this.evoMethodComboBox4.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox4_SelectedIndexChanged);
//
// evoMethodComboBox5
//
this.evoMethodComboBox5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox5.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox5.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox5.FormattingEnabled = true;
this.evoMethodComboBox5.Location = new System.Drawing.Point(7, 162);
this.evoMethodComboBox5.Name = "evoMethodComboBox5";
this.evoMethodComboBox5.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox5.TabIndex = 7;
this.evoMethodComboBox5.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox5_SelectedIndexChanged);
//
// evoMethodComboBox6
//
this.evoMethodComboBox6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox6.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox6.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox6.FormattingEnabled = true;
this.evoMethodComboBox6.Location = new System.Drawing.Point(7, 195);
this.evoMethodComboBox6.Name = "evoMethodComboBox6";
this.evoMethodComboBox6.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox6.TabIndex = 8;
this.evoMethodComboBox6.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox6_SelectedIndexChanged);
//
// evoMethodComboBox7
//
this.evoMethodComboBox7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoMethodComboBox7.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoMethodComboBox7.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoMethodComboBox7.FormattingEnabled = true;
this.evoMethodComboBox7.Location = new System.Drawing.Point(7, 228);
this.evoMethodComboBox7.Name = "evoMethodComboBox7";
this.evoMethodComboBox7.Size = new System.Drawing.Size(182, 21);
this.evoMethodComboBox7.TabIndex = 9;
this.evoMethodComboBox7.SelectedIndexChanged += new System.EventHandler(this.evoMethodComboBox7_SelectedIndexChanged);
//
// evoParamUpDown1
//
this.evoParamUpDown1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown1.Location = new System.Drawing.Point(284, 30);
this.evoParamUpDown1.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown1.Name = "evoParamUpDown1";
this.evoParamUpDown1.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown1.TabIndex = 10;
this.evoParamUpDown1.ValueChanged += new System.EventHandler(this.evoParamUpDown1_ValueChanged);
//
// evoParamUpDown2
//
this.evoParamUpDown2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown2.Location = new System.Drawing.Point(284, 63);
this.evoParamUpDown2.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown2.Name = "evoParamUpDown2";
this.evoParamUpDown2.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown2.TabIndex = 11;
this.evoParamUpDown2.ValueChanged += new System.EventHandler(this.evoParamUpDown2_ValueChanged);
//
// evoParamUpDown3
//
this.evoParamUpDown3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown3.Location = new System.Drawing.Point(284, 96);
this.evoParamUpDown3.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown3.Name = "evoParamUpDown3";
this.evoParamUpDown3.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown3.TabIndex = 12;
this.evoParamUpDown3.ValueChanged += new System.EventHandler(this.evoParamUpDown3_ValueChanged);
//
// evoParamUpDown4
//
this.evoParamUpDown4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown4.Location = new System.Drawing.Point(284, 129);
this.evoParamUpDown4.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown4.Name = "evoParamUpDown4";
this.evoParamUpDown4.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown4.TabIndex = 13;
this.evoParamUpDown4.ValueChanged += new System.EventHandler(this.evoParamUpDown4_ValueChanged);
//
// evoParamUpDown5
//
this.evoParamUpDown5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown5.Location = new System.Drawing.Point(284, 162);
this.evoParamUpDown5.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown5.Name = "evoParamUpDown5";
this.evoParamUpDown5.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown5.TabIndex = 14;
this.evoParamUpDown5.ValueChanged += new System.EventHandler(this.evoParamUpDown5_ValueChanged);
//
// evoParamUpDown6
//
this.evoParamUpDown6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown6.Location = new System.Drawing.Point(284, 195);
this.evoParamUpDown6.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown6.Name = "evoParamUpDown6";
this.evoParamUpDown6.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown6.TabIndex = 15;
this.evoParamUpDown6.ValueChanged += new System.EventHandler(this.evoParamUpDown6_ValueChanged);
//
// evoParamUpDown7
//
this.evoParamUpDown7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoParamUpDown7.Location = new System.Drawing.Point(284, 229);
this.evoParamUpDown7.Maximum = new decimal(new int[] {
65535,
0,
0,
0});
this.evoParamUpDown7.Name = "evoParamUpDown7";
this.evoParamUpDown7.Size = new System.Drawing.Size(90, 20);
this.evoParamUpDown7.TabIndex = 16;
this.evoParamUpDown7.ValueChanged += new System.EventHandler(this.evoParamUpDown7_ValueChanged);
//
// evoTargetMonComboBox1
//
this.evoTargetMonComboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox1.FormattingEnabled = true;
this.evoTargetMonComboBox1.Location = new System.Drawing.Point(380, 30);
this.evoTargetMonComboBox1.Name = "evoTargetMonComboBox1";
this.evoTargetMonComboBox1.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox1.TabIndex = 17;
//
// evoTargetMonComboBox2
//
this.evoTargetMonComboBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox2.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox2.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox2.FormattingEnabled = true;
this.evoTargetMonComboBox2.Location = new System.Drawing.Point(380, 63);
this.evoTargetMonComboBox2.Name = "evoTargetMonComboBox2";
this.evoTargetMonComboBox2.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox2.TabIndex = 18;
//
// evoTargetMonComboBox3
//
this.evoTargetMonComboBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox3.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox3.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox3.FormattingEnabled = true;
this.evoTargetMonComboBox3.Location = new System.Drawing.Point(380, 96);
this.evoTargetMonComboBox3.Name = "evoTargetMonComboBox3";
this.evoTargetMonComboBox3.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox3.TabIndex = 19;
//
// evoTargetMonComboBox4
//
this.evoTargetMonComboBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox4.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox4.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox4.FormattingEnabled = true;
this.evoTargetMonComboBox4.Location = new System.Drawing.Point(380, 129);
this.evoTargetMonComboBox4.Name = "evoTargetMonComboBox4";
this.evoTargetMonComboBox4.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox4.TabIndex = 20;
//
// evoTargetMonComboBox5
//
this.evoTargetMonComboBox5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox5.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox5.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox5.FormattingEnabled = true;
this.evoTargetMonComboBox5.Location = new System.Drawing.Point(380, 162);
this.evoTargetMonComboBox5.Name = "evoTargetMonComboBox5";
this.evoTargetMonComboBox5.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox5.TabIndex = 21;
//
// evoTargetMonComboBox6
//
this.evoTargetMonComboBox6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox6.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox6.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox6.FormattingEnabled = true;
this.evoTargetMonComboBox6.Location = new System.Drawing.Point(380, 195);
this.evoTargetMonComboBox6.Name = "evoTargetMonComboBox6";
this.evoTargetMonComboBox6.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox6.TabIndex = 22;
//
// evoTargetMonComboBox7
//
this.evoTargetMonComboBox7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.evoTargetMonComboBox7.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.evoTargetMonComboBox7.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.evoTargetMonComboBox7.Location = new System.Drawing.Point(380, 228);
this.evoTargetMonComboBox7.Name = "evoTargetMonComboBox7";
this.evoTargetMonComboBox7.Size = new System.Drawing.Size(183, 21);
this.evoTargetMonComboBox7.TabIndex = 0;
//
// descLabel1
//
this.descLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel1.AutoSize = true;
this.descLabel1.Location = new System.Drawing.Point(195, 34);
this.descLabel1.Name = "descLabel1";
this.descLabel1.Size = new System.Drawing.Size(83, 13);
this.descLabel1.TabIndex = 23;
this.descLabel1.Text = "at Level";
this.descLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// descLabel2
//
this.descLabel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel2.AutoSize = true;
this.descLabel2.Location = new System.Drawing.Point(195, 67);
this.descLabel2.Name = "descLabel2";
this.descLabel2.Size = new System.Drawing.Size(83, 13);
this.descLabel2.TabIndex = 24;
this.descLabel2.Text = "at Level";
this.descLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// descLabel3
//
this.descLabel3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel3.AutoSize = true;
this.descLabel3.Location = new System.Drawing.Point(195, 100);
this.descLabel3.Name = "descLabel3";
this.descLabel3.Size = new System.Drawing.Size(83, 13);
this.descLabel3.TabIndex = 25;
this.descLabel3.Text = "at Level";
this.descLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// descLabel4
//
this.descLabel4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel4.AutoSize = true;
this.descLabel4.Location = new System.Drawing.Point(195, 133);
this.descLabel4.Name = "descLabel4";
this.descLabel4.Size = new System.Drawing.Size(83, 13);
this.descLabel4.TabIndex = 26;
this.descLabel4.Text = "at Level";
this.descLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// descLabel5
//
this.descLabel5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel5.AutoSize = true;
this.descLabel5.Location = new System.Drawing.Point(195, 166);
this.descLabel5.Name = "descLabel5";
this.descLabel5.Size = new System.Drawing.Size(83, 13);
this.descLabel5.TabIndex = 27;
this.descLabel5.Text = "at Level";
this.descLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// descLabel6
//
this.descLabel6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel6.AutoSize = true;
this.descLabel6.Location = new System.Drawing.Point(195, 199);
this.descLabel6.Name = "descLabel6";
this.descLabel6.Size = new System.Drawing.Size(83, 13);
this.descLabel6.TabIndex = 28;
this.descLabel6.Text = "at Level";
this.descLabel6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// descLabel7
//
this.descLabel7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.descLabel7.AutoSize = true;
this.descLabel7.Location = new System.Drawing.Point(195, 232);
this.descLabel7.Name = "descLabel7";
this.descLabel7.Size = new System.Drawing.Size(83, 13);
this.descLabel7.TabIndex = 29;
this.descLabel7.Text = "at Level";
this.descLabel7.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// EvolutionsEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(576, 321);
this.Controls.Add(this.tableLayoutPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "EvolutionsEditor";
this.Text = "Evolutions Editor";
this.tableLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pokemonPictureBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.monNumberNumericUpDown)).EndInit();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown5)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown6)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.evoParamUpDown7)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Button saveDataButton;
private System.Windows.Forms.PictureBox pokemonPictureBox;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label paramLabel;
private System.Windows.Forms.Label label1;
private InputComboBox evoMethodComboBox1;
private InputComboBox evoMethodComboBox2;
private InputComboBox evoMethodComboBox3;
private InputComboBox evoMethodComboBox4;
private InputComboBox evoMethodComboBox5;
private InputComboBox evoMethodComboBox6;
private InputComboBox evoMethodComboBox7;
private System.Windows.Forms.NumericUpDown evoParamUpDown1;
private System.Windows.Forms.NumericUpDown evoParamUpDown2;
private System.Windows.Forms.NumericUpDown evoParamUpDown3;
private System.Windows.Forms.NumericUpDown evoParamUpDown4;
private System.Windows.Forms.NumericUpDown evoParamUpDown5;
private System.Windows.Forms.NumericUpDown evoParamUpDown6;
private System.Windows.Forms.NumericUpDown evoParamUpDown7;
private InputComboBox evoTargetMonComboBox1;
private InputComboBox evoTargetMonComboBox2;
private InputComboBox evoTargetMonComboBox3;
private InputComboBox evoTargetMonComboBox4;
private InputComboBox evoTargetMonComboBox5;
private InputComboBox evoTargetMonComboBox6;
private InputComboBox evoTargetMonComboBox7;
private System.Windows.Forms.Label descLabel1;
private System.Windows.Forms.Label descLabel2;
private System.Windows.Forms.Label descLabel3;
private System.Windows.Forms.Label descLabel4;
private System.Windows.Forms.Label descLabel5;
private System.Windows.Forms.Label descLabel6;
private System.Windows.Forms.Label descLabel7;
public InputComboBox pokemonNameInputComboBox;
public System.Windows.Forms.NumericUpDown monNumberNumericUpDown;
}
}
================================================
FILE: DS_Map/EvolutionsEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAacSURBVFhHxZd5bFRVGMX5Aw24VmtbI4lGoyHGYPSP
mqgoEQg0SqELbVEiGiWAqIS1lha6sdTK0oWyiAYQTBVQBEqrgEaIghAKDaC1te1M91k7nZnXmS4z0+N3
7rQDtTMmNia85Mx777v3/s5533uzjQJwS+V/8W+3ReVUmMOzK3B/VjnCMstx19py3LGmHGNHKK4lgywy
yY7MKjsqXqP9lrINBKC5Jfu8A1VWH65YfDhv9MrQ/7ORRSbZ9Ihce7RMPP0hZJy7MKarsfkwOr8WYzfX
YdTGGlitHdC1W1DfNjJxLRlkkUk2PeglnnfTeDBAJFt01epFWKEOY+IyMHarDna7DY0mCWEUmWz+vahB
yRo4D1bjeaPJqhhkkUk2PeglnhE0vilABSpNHkSVNOKe2Zm4t6gRmtOBVqsDbZ1utDu60Wp3o8XmQnNH
l0hDa6dLFKzGcw0tFjucDodikUk2PehFTxrfCCBtOdfWi3Hb9Xhw+UGEF+uhaU4Y7C6kzE7E6ynJ2Lm9
BNu3FWNbUQEMjh4kJcZjR8m2ILViFBcWoM2myUU4FYtMsulBL3rSOBCA9+VMcy8e2dGAJz7VI6q4Hq6u
LhXA1NUHs9ur9gatVxmxI0Y5NmpSc/prBqmZ5Jx1jrfbuhSDLDLJpsfAMzA8wOnGHjy+swFP7tZhXIkE
cLlhFJDZ5YW1G7L3SQgvjF2eG3L6A3COxd0fmKNCye0hgywyyaZH0AAPSPFEQ4+aOOFznUrb090Nq6sP
ydLWOclJ/nYXF6EkoEIUF2yVcP0yJyEwh/Wigi0waz3oFgZZZJJND3rRk8ZDAhyrd8tEPZ7Zo8dju3To
6emFRdre0QPY+qD2NGM3/OqHRa6YV//POayZpQtkkEUm2fQIGeBwrRvP7tUjep8e43c3oK/Pgw65950C
pgjvEGO7HDvkc2qwRkMes869rXcgoMujGGSRSTY9ggfIqUBptQvPfdGE5/c34ilpmcfjhV1giXEzA211
eICkhHikJCXK01+kanapJcbPGrg9heodUbhlM2zdPsUgi0yy6UEvetI4ECBCivv/cOHFA8146csm1TKv
V65s4OoGr8wmV8wQTukAjVljF1QH5DwwV2o2eSg9nn7FIpNsetCLnjQeEmDv7xomlbZgsiha0nKT24hO
GlDSVpsocB6qNlB3yp4bWWSSTY+QAT67qmHqVy2Y/rVMlsSndG4F8PWPTNzIIItMsukRMsAuGYw52IrX
DrXi1YMtmFLajJdl8cQDIxPXkkEWmWTTI2SA7VUaYg+3Ie7bNsSLZn3ThplyPuNw64jEtWSQRSbZ9AgZ
oPiKhoQj7Zj9XTuSRDyOFUDMoTZMk/T/RVzDtWSQRSaP6RE0QKQUCyo1JB81YM4xv+KPGFBaaQC88lj3
iTzymHvl8ad4zFooyRquJWOQRzY96EVPGg8JsPWShrnHDXizzKD2cZIYXg+u1ptwVdeB6hYNfxm7lapb
nKpWVW8WmYaqTubLHj6PYtzMpEfIAJsuOTGv3Ii3RPNOGJEgbePVXtfZYJKPvozsPEybOhnTpryC9Mx1
qnZd34lrMn5df0M8vybhuJYMshRTRI+QAT655MC735swX/ROhQnJ0jZCqpsd4Fs6ZnoMlqXlinKwcEka
5INOjVU324erqVOtJYMsMsmmR8gAH1/UsPCkBYtOmrHgBzPeKDNKG72oadUgdxyxM2Kxam0eVq7ZgPeX
r0WvvNc5VtPqHK4Wh6z1KQZZZJJNj5ABNl504IPTZqXFp8yqZej3oU7uOX8jx8XFIy07Hx9l5mPJqmzI
o6bG6gyuoOJaMsga5NIjZIANMrj0J6vIgiU/WlTLhAKduVde5QsncTYy1m1Ges4mLF+dq0JxTGfqHi4J
xrVkkEUm2fT4lwAaUs/akHqmAyt+tmLRKYsMQ350elSApOQUrFm/BWskxMqM9ZBHAM0y1tTRN1TWPjRb
5UtENjLIIpNsegQNEJVV1pl/2Y11FzTk/uaUPxBOrDhrVxCTpnZISExEWmYeVmflITU9V9WMTshvweEy
ibiRQRaZZNMjYuWBs+I55Gd5mCg6KvO4nemo8Oxy3J5ehmvXanHu8p/45XIN3p6/4L2lq1IXf7hs2eK5
G/fsuFBVi18rZSyIzom4lgyyBrkRy/edE6+nRUP+mNwmekgULZosmhJEL4jGix4WPSqaIJooCjY3lCaJ
aM6rH/LXjBtDsBO8N8F0n2iMiAs5905RuCjY3FCiMa982J/TW7SNGvU3iJOEw8UaLRYAAAAASUVORK5C
YII=
AAABAAEAwMAAAAEACAAopgAAFgAAACgAAADAAAAAgAEAAAEACAAAAAAAAJAAAMEOAADBDgAAAAEAAAAB
AAAAAAAADEpYAA9bbgAKLjUAHXyQABgYGAAQEBAALFBXAF280AAjR04ARaS4AKCgoAC9vdAAPT1QALCw
sACQkJAAKU1UAFW0yAB4eHgAH0NKAP8p+wB3w9YAMjlMACQ3SgDQ0NAACC6lAAAV/wAAQbEAAEf/AAAq
nQBsf5IA/xzHACx02gBnd64AAB3/AHp/gQAmN0oAKzxPAKCgnABlZWUAaGhoAN/fzgD/ewAAKysnANra
yQDk5NEA1sOwAInV1QDW1sUA2dnIAOLi0QAICg8AbW1vAB8yQwD/ogAAKCUhAC4/UgDJtqUAurq2AOHh
0ACVlZUAa2trAC0+UQCRlpYAeL/SAInHxwB3fH4AebfIAHe1wwBARVgAZrLBAGqouwAJDg4ASZemAF6c
rQAUHBwASJSkAAIHCQAVY3IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAQEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAAAAAQEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAQEBAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAQEBAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAA
AQEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAAAAAAAAAQEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
AgICAgICAgICAgICAgICAgICAAAAAAAATU1NTk5OBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgICAgICAAAAAAAATU1NTk5OBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgICAgICAAAAAAAATU1NTk5OBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgICAgICAAAAAAAA
AAAATU1NTk5OBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
AgICAgICAAAAAAAAAAAATU1NTk5OBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEAgICAgICAAAAAAAAAAAATU1NTk5OBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE
BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgICAgICAAAAAAAAAAAAAAAAS0tLTExMERERERERCAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgI
ERERERERCgoKCgoKFRUVFRUVLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vFRUVFRUVCAgICAgIFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAAS0tLTExM
ERERERERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUV
CAgICAgICAgICAgIERERERERCgoKCgoKFRUVFRUVLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vFRUVFRUV
CAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAAS0tLTExMERERERERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgIFRUVFRUVCAgICAgICAgICAgIERERERERCgoKCgoKFRUVFRUVLy8vLy8vFRUVFRUVFRUVFRUV
Ly8vLy8vFRUVFRUVCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgICAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGS0tLTExMERERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgIERERERERCgoKCgoKFRUVFRUVLy8vLy8v
FRUVFRUVFRUVFRUVLy8vLy8vFRUVFRUVCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgI
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGS0tLTExMERERCAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgIERERERERCgoKCgoK
FRUVFRUVLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vFRUVFRUVCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUV
FRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGS0tLTExMERERCAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgI
ERERERERCgoKCgoKFRUVFRUVLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vFRUVFRUVCAgICAgIFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
S0tLTExMERERERERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgI
CAgICAgIFRUVFRUVCAgICAgICAgICAgIFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGS0tLTExMERERERERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
FRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgIFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGS0tLTExMERERERERCAgICAgICAgICAgICAgICAgICAgICAgI
CAgICAgICAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgIFRUVFRUVFRUVFRUV
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGS0tLTExMERERCAgICAgICAgICAgI
CAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgICAgICAgI
FRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGS0tLTExMERER
CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUV
FRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUV
CAgICAgICAgICAgIFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGS0tLTExMERERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUVFRUVFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgI
CAgICAgIFRUVFRUVCAgICAgICAgICAgIFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAASEhISkpKCAgICAgIERERERERCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUV
FRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgIERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhISkpKCAgICAgIERERERERCAgICAgIFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgI
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhISkpKCAgICAgIERERERER
CAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgI
FRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhI
SUlJCAgIERERERERCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUV
CAgICAgICAgICAgIFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAASEhISUlJCAgIERERERERCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUV
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAASEhISUlJCAgIERERERERCAgICAgIFRUVFRUVFRUVFRUVFRUVFRUV
FRUVFRUVFRUVFRUVLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVCAgICAgICAgICAgIFRUVFRUVCAgICAgIERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFAAAAAAAADQ0NDQ0NRUVFR0dHCAgICAgILy8vLy8vFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVCgoKCgoKFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
CgoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vCAgICAgICAgICAgI
FRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFAAAAAAAADQ0NDQ0NRUVFR0dHCAgICAgI
Ly8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCgoKCgoKFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8v
CAgICAgICAgICAgIFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFAAAAAAAADQ0NDQ0N
RUVFR0dHCAgICAgILy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCgoKCgoKFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUV
FRUVFRUVLy8vLy8vCAgICAgICAgICAgIFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
AAAAAAAADQ0NDQ0NDQ0NRUVFRkZGCAgILy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCgoKCgoK
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vCAgICAgICAgICAgIFRUVFRUVBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFAAAAAAAADQ0NDQ0NDQ0NRUVFRkZGCAgILy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUV
FRUVFRUVCgoKCgoKFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vCAgICAgICAgICAgIFRUVFRUVBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFAAAAAAAADQ0NDQ0NDQ0NRUVFRkZGCAgILy8vLy8vFRUVFRUV
FRUVFRUVFRUVFRUVFRUVFRUVCgoKCgoKFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
CgoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVLy8vLy8vCAgICAgICAgICAgI
FRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFAAAAAAAAEhISEhISQkJCRERE
FRUVFRUVFRUVFRUVFRUVFRUVHh4eHh4eFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vFRUVFRUVLy8vLy8vCAgICAgI
CAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFAAAAAAAA
EhISEhISQkJCREREFRUVFRUVFRUVFRUVFRUVFRUVHh4eHh4eFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vFRUVFRUV
Ly8vLy8vCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFAAAAAAAAEhISEhISQkJCREREFRUVFRUVFRUVFRUVFRUVFRUVHh4eHh4eFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8v
Ly8vLy8vFRUVFRUVLy8vLy8vCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFAAAAAAAAEhISEhISEhISQkJCQ0NDFRUVFRUVFRUVFRUVFRUVHh4eHh4e
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
CgoKCgoKLy8vLy8vLy8vLy8vFRUVFRUVLy8vLy8vCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFAAAAAAAAEhISEhISEhISQkJCQ0NDFRUVFRUVFRUV
FRUVFRUVHh4eHh4eFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vFRUVFRUVLy8vLy8vCAgICAgICAgICAgICAgICAgI
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFAAAAAAAAEhISEhISEhISQkJC
Q0NDFRUVFRUVFRUVFRUVFRUVHh4eHh4eFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCgoKCgoKLy8vLy8vLy8vLy8vFRUVFRUVLy8vLy8vCAgICAgI
CAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAAAAAAAAAAPz8/QUFBFRUVFRUVFxcXFxcXFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLi4uLi4u
LS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8v
FRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAAPz8/QUFBFRUVFRUVFxcXFxcXFxcXFxcXFxcXFxcXKCgoKCgo
Li4uLi4uLi4uLi4uLS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXFxcXFxcX
Ly8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAAPz8/QUFBFRUVFRUVFxcXFxcXFxcXFxcX
FxcXFxcXKCgoKCgoLi4uLi4uLi4uLi4uLS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcX
FxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAADw8PPz8/QEBAFRUV
FxcXFxcXFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLi4uLi4uLS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4u
KCgoKCgoFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgI
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAA
Dw8PPz8/QEBAFRUVFxcXFxcXFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLi4uLi4uLS0tLS0tLS0tLS0t
Li4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8vFRUVFRUVFRUVFRUV
FRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAAAAAAAAAADw8PPz8/QEBAFRUVFxcXFxcXFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLi4uLi4u
LS0tLS0tLS0tLS0tLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8v
FRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAAIyMjJSUlFxcXFxcXKCgoKCgoLi4uLi4uLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uKCgoKCgoFxcXFxcX
FxcXFxcXLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAAIyMjJSUlFxcXFxcXKCgoKCgo
Li4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4u
KCgoKCgoFxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAAIyMjJSUl
FxcXFxcXKCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUV
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
AAAAAAAADw8PIyMjPj4+FxcXKCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUVFRUVFRUV
FRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFAAAAAAAADw8PIyMjPj4+FxcXKCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLy8vLy8v
FRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAADw8PIyMjPj4+FxcXKCgoKCgoLi4uLi4uLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uKCgoKCgoFxcXFxcX
FxcXFxcXLy8vLy8vFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFNjY2NjY2NjY2NjY2BQUFBQUFAAAAAAAAPDw8PT09LS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKCgoKCgoFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFNjY2NjY2NjY2NjY2BQUFBQUFAAAAAAAA
PDw8PT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgICAgICAgI
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFNjY2NjY2NjY2NjY2
BQUFBQUFAAAAAAAAPDw8PT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgI
CAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
NjY2NjY2NjY2NjY2BQUFBQUFAAAAAAAACwsLPDw8Ozs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXFxcXFxcX
FRUVFRUVCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFNjY2NjY2NjY2NjY2BQUFBQUFAAAAAAAACwsLPDw8Ozs7LS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgo
FxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFNjY2NjY2NjY2NjY2BQUFBQUFAAAAAAAACwsLPDw8Ozs7LS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKCgoKCgoFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBgYGBgYGNjY2NjY2BgYGBgYG
AAAAAAAAOjo6Ozs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eFRUVFRUVFRUVFRUVCAgICAgI
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBgYGBgYG
NjY2NjY2BgYGBgYGAAAAAAAAOjo6Ozs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eFRUVFRUV
FRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2
BQUFBQUFBgYGBgYGNjY2NjY2BgYGBgYGAAAAAAAAOjo6Ozs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcX
Hh4eHh4eFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGNjY2NjY2BQUFBQUFBgYGBgYGNjY2NjY2BgYGBgYGAAAAAAAADg4OOjo6Ozs7LS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
KCgoKCgoFxcXFxcXHh4eHh4eFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBgYGBgYGNjY2NjY2BgYGBgYGAAAAAAAADg4OOjo6
Ozs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eFRUVFRUVFRUVFRUVCAgICAgIERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBgYGBgYGNjY2NjY2BgYGBgYG
AAAAAAAADg4OOjo6Ozs7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eFRUVFRUVFRUVFRUVCAgICAgI
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBQUFBQUF
NjY2NjY2AAAAAAAABgYGBgYGAAAAAAAAKysrMDAwLS0tLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcX
KCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXLy8vLy8v
Ly8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2
BQUFBQUFBQUFBQUFNjY2NjY2AAAAAAAABgYGBgYGAAAAAAAAKysrMDAwLS0tLS0tLi4uLi4uKCgoKCgo
FxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcX
FxcXFxcXLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGNjY2NjY2BQUFBQUFBQUFBQUFNjY2NjY2AAAAAAAABgYGBgYGAAAAAAAAKysrMDAwLS0tLS0t
Li4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Li4uLi4uFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBQUFBQUFNjY2NjY2AAAAAAAABgYGBgYGAAAAAAAA
AAAAKysrMjIyLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBQUFBQUFNjY2NjY2AAAAAAAA
BgYGBgYGAAAAAAAAAAAAKysrMjIyLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXKCgoKCgoLi4uLi4u
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXLy8vLy8vLy8vLy8vLy8vLy8v
FRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGNjY2NjY2BQUFBQUFBQUFBQUF
NjY2NjY2AAAAAAAABgYGBgYGAAAAAAAAAAAAKysrMjIyLS0tLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcX
KCgoKCgoLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXLy8vLy8v
Ly8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
NjY2NjY2NjY2NjY2AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNzc3OTk5FxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgo
FxcXFxcXHh4eHh4eLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGNjY2NjY2NjY2NjY2AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNzc3OTk5
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGNjY2NjY2NjY2NjY2AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFNzc3OTk5FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGNjY2NjY2NjY2NjY2AAAAAAAABQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFAAAANzc3ODg4FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
Li4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4eLy8vLy8vLy8vLy8v
FRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGNjY2NjY2NjY2NjY2
AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAANzc3ODg4FxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXHh4eHh4e
Ly8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
NjY2NjY2NjY2NjY2AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAANzc3ODg4FxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgo
FxcXFxcXHh4eHh4eLy8vLy8vLy8vLy8vFRUVFRUVBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFKioqKioqKioqKioqBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
MzMzNTU1KCgoKCgoLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0t
LS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFKioqKioqKioqKioqBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGMzMzNTU1KCgoKCgoLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLi4uLi4u
LS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFKioqKioqKioqKioqBgYGBgYGBgYGBgYGBgYGBgYG
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGMzMzNTU1KCgoKCgoLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcX
FxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgI
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFKioqKioqKioqKioqBgYGBgYG
BgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAMzMzNDQ0KCgoLi4uLi4uLi4uLi4u
KCgoKCgoFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcX
FRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFKioqKioq
KioqKioqBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAMzMzNDQ0KCgo
Li4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0tLS0tLS0tLi4uLi4u
FxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFKioqKioqKioqKioqBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
AAAAMzMzNDQ0KCgoLi4uLi4uLi4uLi4uKCgoKCgoFxcXFxcXFxcXFxcXLi4uLi4uLS0tLS0tLS0tLS0t
LS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFKioqKioqBgYGBgYGAAAAAAAAKioqKioqBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGKysrMDAwLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXKCgoKCgo
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tFxcXFxcXFxcXFxcXFRUVFRUVERERERERCAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYGAAAAAAAAKioqKioqBgYGBgYGBgYGBgYG
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGKysrMDAwLS0tLS0tLS0tLS0tLS0tLS0tKCgoKCgo
FxcXFxcXKCgoKCgoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tFxcXFxcXFxcXFxcXFRUVFRUVERERERER
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYGAAAAAAAAKioqKioq
BgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGKysrMDAwLS0tLS0tLS0tLS0t
LS0tLS0tKCgoKCgoFxcXFxcXKCgoKCgoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tFxcXFxcXFxcXFxcX
FRUVFRUVERERERERCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYG
AAAAAAAAKioqKioqBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGAAAAKysr
MjIyLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXKCgoKCgoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
FxcXFxcXFxcXFxcXFRUVFRUVERERERERCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
KioqKioqBgYGBgYGAAAAAAAAKioqKioqBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGAAAAKysrMjIyLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXKCgoKCgoLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tFxcXFxcXFxcXFxcXFRUVFRUVERERERERCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFKioqKioqBgYGBgYGAAAAAAAAKioqKioqBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGAAAAKysrMjIyLS0tLS0tLS0tLS0tLS0tKCgoKCgoFxcXFxcXKCgoKCgo
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tFxcXFxcXFxcXFxcXFRUVFRUVERERERERCAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYGBgYGBgYGKioqKioqAAAAAAAABQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGKysrMDAwLS0tLS0tLS0tLS0tLi4uLi4u
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgI
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYGBgYGBgYGKioqKioq
AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGKysrMDAwLS0tLS0t
LS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FRUVFRUVCAgICAgICgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYG
BgYGBgYGKioqKioqAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
KysrMDAwLS0tLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
KioqKioqBgYGBgYGBgYGBgYGKioqKioqAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGAAAAKysrMTExLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFKioqKioqBgYGBgYGBgYGBgYGKioqKioqAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGAAAAKysrMTExLS0tLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFKioqKioqBgYGBgYGBgYGBgYGKioqKioqAAAAAAAABQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGAAAAKysrMTExLS0tLS0tLS0tLi4uLi4u
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgI
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGKioqKioqKioqKioqBQUFBQUF
BgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKysrMDAw
LS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
Ly8vLy8vFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGKioqKioq
KioqKioqBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFKysrMDAwLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGKioqKioqKioqKioqBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFKysrMDAwLS0tLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGKioqKioqKioqKioqBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAAKysrLCwsLS0tLi4uLi4uFxcXFxcXFxcXFxcX
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUVCAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGKioqKioqKioqKioqBQUFBQUFBgYGBgYGAAAAAAAA
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAAKysrLCwsLS0tLi4uLi4u
FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXLy8vLy8vFRUVFRUV
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGKioqKioqKioqKioqBQUFBQUF
BgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAAKysr
LCwsLS0tLi4uLi4uFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcX
Ly8vLy8vFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
Hx8fHx8fHx8fHx8fBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
AAAAAAAADQ0NDQ0NJiYmKSkpKCgoKCgoFxcXFxcXHR0dHR0dHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwc
FxcXFxcXFxcXFxcXFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFHx8fHx8fHx8fHx8fBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFAAAAAAAADQ0NDQ0NJiYmKSkpKCgoKCgoFxcXFxcXHR0dHR0dHBwcHBwcHBwcHBwc
HBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFHx8fHx8fHx8fHx8fBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAADQ0NDQ0NJiYmKSkpKCgoKCgoFxcXFxcXHR0dHR0d
HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFHx8fHx8fHx8fHx8fBQUFBQUFBgYGBgYG
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAADQ0NDQ0NDw8PJiYmJycnKCgo
FxcXFxcXHR0dHR0dHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVFRUVFRUV
CAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFHx8fHx8fHx8fHx8f
BQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAADQ0NDQ0N
Dw8PJiYmJycnKCgoFxcXFxcXHR0dHR0dHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcX
FRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
Hx8fHx8fHx8fHx8fBQUFBQUFBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
AAAAAAAADQ0NDQ0NDw8PJiYmJycnKCgoFxcXFxcXHR0dHR0dHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwc
FxcXFxcXFxcXFxcXFRUVFRUVFRUVFRUVCAgICAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGHx8fHx8fBQUFBQUFBgYGBgYGHx8fHx8fBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFAAAAAAAADg4ODg4OGBgYGBgYGBgYGBgYIyMjJSUlFxcXFxcXGhoaGhoaHBwcHBwcHBwcHBwc
HBwcHBwcGhoaGhoaFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBgYGBgYGHx8fHx8fBgYGBgYGAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADg4ODg4OGBgYGBgYGBgYGBgYIyMjJSUlFxcXFxcXGhoaGhoa
HBwcHBwcHBwcHBwcHBwcHBwcGhoaGhoaFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBgYGBgYGHx8fHx8fBgYGBgYG
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADg4ODg4OGBgYGBgYGBgYGBgYIyMjJSUl
FxcXFxcXGhoaGhoaHBwcHBwcHBwcHBwcHBwcHBwcGhoaGhoaFxcXFxcXFxcXFxcXFRUVFRUVERERERER
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBgYGBgYG
Hx8fHx8fBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADg4ODg4OGBgYGBgY
GBgYGBgYDw8PIyMjJCQkFxcXGhoaGhoaHBwcHBwcHBwcHBwcHBwcHBwcGhoaGhoaFxcXFxcXFxcXFxcX
FRUVFRUVERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGHx8fHx8f
BQUFBQUFBgYGBgYGHx8fHx8fBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAA
Dg4ODg4OGBgYGBgYGBgYGBgYDw8PIyMjJCQkFxcXGhoaGhoaHBwcHBwcHBwcHBwcHBwcHBwcGhoaGhoa
FxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGHx8fHx8fBQUFBQUFBgYGBgYGHx8fHx8fBgYGBgYGAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFAAAAAAAADg4ODg4OGBgYGBgYGBgYGBgYDw8PIyMjJCQkFxcXGhoaGhoaHBwcHBwcHBwcHBwc
HBwcHBwcGhoaGhoaFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBQUFBQUFHx8fHx8fAAAAAAAABgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFAAAAAAAADg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYISEhIiIiHBwcHBwc
HBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0dFxcXFxcXCgoKCgoKCAgICAgIERERERERERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBQUFBQUFHx8fHx8fAAAAAAAA
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAADg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgY
ISEhIiIiHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0dFxcXFxcXCgoKCgoKCAgICAgIERERERER
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBQUFBQUF
Hx8fHx8fAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAADg4ODg4ODg4ODg4OGBgYGBgY
GBgYGBgYGBgYGBgYISEhIiIiHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0dFxcXFxcXCgoKCgoK
CAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGHx8fHx8f
BQUFBQUFBQUFBQUFHx8fHx8fAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAADg4ODg4O
Dg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYDw8PISEhHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0d
FxcXFxcXCgoKCgoKCAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGHx8fHx8fBQUFBQUFBQUFBQUFHx8fHx8fAAAAAAAABgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
AAAAAAAADg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYDw8PISEhHBwcHBwcHBwcHBwcHBwcHBwc
HBwcHBwcHR0dHR0dFxcXFxcXCgoKCgoKCAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGHx8fHx8fBQUFBQUFBQUFBQUFHx8fHx8fAAAAAAAABgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFAAAAAAAADg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYDw8PISEhHBwcHBwc
HBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0dFxcXFxcXCgoKCgoKCAgICAgIERERERERERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGHx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgY
Dw8PDw8PICAgHBwcHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERER
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGHx8fHx8fHx8fHx8f
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4O
GBgYGBgYGBgYGBgYDw8PDw8PICAgHBwcHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUV
ERERERERERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
Hx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADAwMDAwMDAwMDAwM
Dg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYDw8PDw8PICAgHBwcHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcX
FxcXFxcXFRUVFRUVERERERERERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGHx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAA
DAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYDw8PDw8PDw8PICAgHBwcHBwcHBwcHBwc
HBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERERERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGHx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFAAAAAAAADAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYDw8PDw8PDw8PICAg
HBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERERERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGHx8fHx8fHx8fHx8fBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFAAAAAAAADAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgY
Dw8PDw8PDw8PICAgHBwcHBwcHBwcHBwcHBwcHBwcFxcXFxcXFxcXFxcXFRUVFRUVERERERERERERERER
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGFBQUFBQU
FBQUFBQUBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4O
GBgYGBgYGBgYGBgYGBgYGBgYDw8PDw8PGxsbHBwcHBwcHBwcHR0dHR0dFxcXFxcXHh4eHh4eFRUVFRUV
CAgICAgIERERERERCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGFBQUFBQUFBQUFBQUBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwM
Dg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYDw8PDw8PGxsbHBwcHBwcHBwcHR0dHR0dFxcXFxcX
Hh4eHh4eFRUVFRUVCAgICAgIERERERERCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGFBQUFBQUFBQUFBQUBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAACwsLCwsL
DAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYDw8PDw8PGxsbHBwcHBwcHBwc
HR0dHR0dFxcXFxcXHh4eHh4eFRUVFRUVCAgICAgIERERERERCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGFBQUFBQUFBQUFBQUBQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgYGBgYGBgYDw8PDw8P
DQ0NGxsbHBwcHBwcHR0dHR0dFxcXFxcXHh4eHh4eFRUVFRUVCAgICAgIERERERERCgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGFBQUFBQUFBQUFBQUBQUFBQUF
BQUFBQUFBgYGBgYGAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4OGBgYGBgYGBgYGBgY
GBgYGBgYDw8PDw8PDQ0NGxsbHBwcHBwcHR0dHR0dFxcXFxcXHh4eHh4eFRUVFRUVCAgICAgIERERERER
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGFBQUFBQU
FBQUFBQUBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4O
GBgYGBgYGBgYGBgYGBgYGBgYDw8PDw8PDQ0NGxsbHBwcHBwcHR0dHR0dFxcXFxcXHh4eHh4eFRUVFRUV
CAgICAgIERERERERCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
FBQUFBQUBgYGBgYGAAAAAAAAFBQUFBQUBQUFBQUFAAAAAAAADw8PDw8PCwsLCwsLCwsLCwsLDAwMDAwM
DAwMDAwMAAAAAAAADQ0NDQ0NDQ0NDQ0NGBgYGBgYDw8PDw8PDw8PDw8PGRkZGhoaFxcXFxcXFxcXFxcX
FRUVFRUVCAgICAgICAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAAFBQUFBQUBQUFBQUFAAAAAAAADw8PDw8PCwsLCwsL
CwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAADQ0NDQ0NDQ0NDQ0NGBgYGBgYDw8PDw8PDw8PDw8PGRkZGhoa
FxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAAFBQUFBQUBQUFBQUFAAAAAAAA
Dw8PDw8PCwsLCwsLCwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAADQ0NDQ0NDQ0NDQ0NGBgYGBgYDw8PDw8P
Dw8PDw8PGRkZGhoaFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIERERERERERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAAFBQUFBQU
BQUFBQUFAAAAAAAADw8PDw8PCwsLCwsLCwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAADQ0NDQ0NDQ0NDQ0N
GBgYGBgYDw8PDw8PDw8PDw8PDQ0NGRkZFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgICAgICAgIERERERER
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYG
AAAAAAAAFBQUFBQUBQUFBQUFAAAAAAAADw8PDw8PCwsLCwsLCwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAA
DQ0NDQ0NDQ0NDQ0NGBgYGBgYDw8PDw8PDw8PDw8PDQ0NGRkZFxcXFxcXFxcXFxcXFRUVFRUVCAgICAgI
CAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
FBQUFBQUBgYGBgYGAAAAAAAAFBQUFBQUBQUFBQUFAAAAAAAADw8PDw8PCwsLCwsLCwsLCwsLDAwMDAwM
DAwMDAwMAAAAAAAADQ0NDQ0NDQ0NDQ0NGBgYGBgYDw8PDw8PDw8PDw8PDQ0NGRkZFxcXFxcXFxcXFxcX
FRUVFRUVCAgICAgICAgICAgIERERERERERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8P
CwsLCwsLDAwMDAwMAAAAAAAADg4ODg4OEhISEhISEhISEhISDQ0NDQ0NDw8PDw8PDw8PDw8PDw8PDw8P
FhYWFxcXCAgICAgIFRUVFRUVERERERERERERERERCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAA
Dw8PDw8PDw8PDw8PCwsLCwsLDAwMDAwMAAAAAAAADg4ODg4OEhISEhISEhISEhISDQ0NDQ0NDw8PDw8P
Dw8PDw8PDw8PDw8PFhYWFxcXCAgICAgIFRUVFRUVERERERERERERERERCgoKCgoKCgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGBgYGBgYGFBQUFBQU
BgYGBgYGAAAAAAAADw8PDw8PDw8PDw8PCwsLCwsLDAwMDAwMAAAAAAAADg4ODg4OEhISEhISEhISEhIS
DQ0NDQ0NDw8PDw8PDw8PDw8PDw8PDw8PFhYWFxcXCAgICAgIFRUVFRUVERERERERERERERERCgoKCgoK
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYG
BgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8PCwsLCwsLDAwMDAwMAAAAAAAADg4ODg4O
EhISEhISEhISEhISDQ0NDQ0NDw8PDw8PDw8PDw8PDw8PDw8PDQ0NFhYWCAgICAgIFRUVFRUVERERERER
ERERERERCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
FBQUFBQUBgYGBgYGBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8PCwsLCwsLDAwMDAwM
AAAAAAAADg4ODg4OEhISEhISEhISEhISDQ0NDQ0NDw8PDw8PDw8PDw8PDw8PDw8PDQ0NFhYWCAgICAgI
FRUVFRUVERERERERERERERERCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGFBQUFBQUBgYGBgYGBgYGBgYGFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8P
CwsLCwsLDAwMDAwMAAAAAAAADg4ODg4OEhISEhISEhISEhISDQ0NDQ0NDw8PDw8PDw8PDw8PDw8PDw8P
DQ0NFhYWCAgICAgIFRUVFRUVERERERERERERERERCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFFBQUFBQUFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8P
Dw8PDw8PDw8PDw8PCwsLCwsLAAAAAAAADw8PDw8PDg4ODg4ODg4ODg4OEhISEhISEhISEhISAAAAAAAA
Dw8PDw8PEhISEhISDQ0NDQ0NExMTERERERERERERFRUVFRUVFRUVFRUVCgoKCgoKCgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFFBQUFBQUFBQUFBQUBgYGBgYG
AAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PCwsLCwsLAAAAAAAADw8PDw8PDg4ODg4ODg4ODg4OEhISEhIS
EhISEhISAAAAAAAADw8PDw8PEhISEhISDQ0NDQ0NExMTERERERERERERFRUVFRUVFRUVFRUVCgoKCgoK
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFFBQUFBQU
FBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PCwsLCwsLAAAAAAAADw8PDw8PDg4ODg4O
Dg4ODg4OEhISEhISEhISEhISAAAAAAAADw8PDw8PEhISEhISDQ0NDQ0NExMTERERERERERERFRUVFRUV
FRUVFRUVCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFFBQUFBQUFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PCwsLCwsLAAAAAAAA
Dw8PDw8PDg4ODg4ODg4ODg4OEhISEhISEhISEhISAAAAAAAADw8PDw8PEhISEhISDQ0NDQ0NAAAAExMT
ERERERERFRUVFRUVFRUVFRUVCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFFBQUFBQUFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8P
CwsLCwsLAAAAAAAADw8PDw8PDg4ODg4ODg4ODg4OEhISEhISEhISEhISAAAAAAAADw8PDw8PEhISEhIS
DQ0NDQ0NAAAAExMTERERERERFRUVFRUVFRUVFRUVCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFFBQUFBQUFBQUFBQUBgYGBgYGAAAAAAAADw8PDw8P
Dw8PDw8PDw8PDw8PCwsLCwsLAAAAAAAADw8PDw8PDg4ODg4ODg4ODg4OEhISEhISEhISEhISAAAAAAAA
Dw8PDw8PEhISEhISDQ0NDQ0NAAAAExMTERERERERFRUVFRUVFRUVFRUVCgoKCgoKCgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAADQ0NDQ0NDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAACwsLCwsLDg4ODg4ODg4ODg4ODg4ODg4O
EhISEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTERERERERERERCAgICAgICAgICAgI
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAACwsLCwsLDg4ODg4O
Dg4ODg4ODg4ODg4OEhISEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTERERERERERER
CAgICAgICAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAA
CwsLCwsLDg4ODg4ODg4ODg4ODg4ODg4OEhISEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ExMTERERERERERERCAgICAgICAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NDw8PDw8PAAAAAAAA
AAAAAAAAAAAAAAAACwsLCwsLDg4ODg4ODg4ODg4ODg4ODg4OEhISEhISAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAExMTERERERERCAgICAgICAgICAgIERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0N
Dw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAACwsLCwsLDg4ODg4ODg4ODg4ODg4ODg4OEhISEhISAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTERERERERCAgICAgICAgICAgIERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAADQ0NDQ0NDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAACwsLCwsLDg4ODg4ODg4ODg4ODg4ODg4O
EhISEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTERERERERCAgICAgICAgICAgI
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NAAAAAAAABgYGBgYGBQUFBQUFAAAAAAAACwsLCwsLCwsLCwsL
Dg4ODg4ODg4ODg4ODw8PDw8PAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGEBAQERER
ERERERERCgoKCgoKERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NAAAAAAAABgYGBgYGBQUFBQUFAAAAAAAA
CwsLCwsLCwsLCwsLDg4ODg4ODg4ODg4ODw8PDw8PAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGEBAQERERERERERERCgoKCgoKERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NAAAAAAAABgYGBgYG
BQUFBQUFAAAAAAAACwsLCwsLCwsLCwsLDg4ODg4ODg4ODg4ODw8PDw8PAAAAAAAABgYGBgYGBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGEBAQERERERERERERCgoKCgoKERERERERBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0N
AAAAAAAABgYGBgYGBQUFBQUFAAAAAAAACwsLCwsLCwsLCwsLDg4ODg4ODg4ODg4ODw8PDw8PAAAAAAAA
BgYGBgYGBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGEBAQERERERERCgoKCgoKERERERERBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAADQ0NDQ0NAAAAAAAABgYGBgYGBQUFBQUFAAAAAAAACwsLCwsLCwsLCwsLDg4ODg4ODg4ODg4O
Dw8PDw8PAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGEBAQERERERERCgoKCgoK
ERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGAAAAAAAADQ0NDQ0NAAAAAAAABgYGBgYGBQUFBQUFAAAAAAAACwsLCwsLCwsLCwsL
Dg4ODg4ODg4ODg4ODw8PDw8PAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGEBAQ
ERERERERCgoKCgoKERERERERBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUF
AAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGCQkJCgoKCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBQUFBQUFAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGCQkJCgoKCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAABgYGBgYG
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGCQkJCgoKCgoKCgoKCgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
AAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAACwsLCwsLDAwMDAwMDAwMDAwM
AAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGCQkJCgoKCgoK
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFAAAAAAAACwsLCwsL
DAwMDAwMDAwMDAwMAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGCQkJCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUF
AAAAAAAACwsLCwsLDAwMDAwMDAwMDAwMAAAAAAAABgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGCQkJCgoKCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQkJCgoKCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQkJCgoKCgoKCgoKBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAA
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQkJCgoK
CgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAAAAAAA
AAAAAAAAAAAAAAAABQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGCQkJCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGCQkJCgoKCgoKBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGCQkJCgoKCgoKBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBwcHCAgIBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BwcHCAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBwcHCAgIBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBwcHBAQEBAQEAgICAgICAAAAAAAAAAAAAAAABQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYG
BgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBwcHBAQEBAQEAgICAgICAAAAAAAA
AAAAAAAABQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYG
BgYGBgYGBgYGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBwcHBAQEBAQE
AgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAwMDBAQEAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAwMDBAQEAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBAQEAgICAgICAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAgICAgICAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMD
AgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAwMDAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgICAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgICAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
================================================
FILE: DS_Map/ExtensionMethods.cs
================================================
using System;
using System.Windows.Forms;
namespace DSPRE {
public static class ExtensionMethods {
///
/// Increment the progress bar value, without using Windows Aero animation
///
public static void IncrementNoAnimation(this ProgressBar pb, int amount = 1) {
pb.Value += amount;
if (pb.Value != pb.Maximum){ pb.Value++; }
pb.Value--;
}
//https://stackoverflow.com/a/10939890
///
/// Sets the progress bar value, without using Windows Aero animation
///
public static void SetProgressNoAnimation(this ProgressBar pb, int value) {
// Don't redraw if nothing is changing.
if (value == pb.Value)
return;
// To get around this animation, we need to move the progress bar backwards.
if (value == pb.Maximum) {
// Special case (can't set value > Maximum).
pb.Value = value; // Set the value
pb.Value = value - 1; // Move it backwards
}
else {
pb.Value = value + 1; // Move past
}
pb.Value = value; // Move to correct value
}
/*
searchInScriptsButton.BeginInvoke(new Action(() => {
}));
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (_sender, args) => {
this.UIThread(() => {
});
};
//easier to set up
searchInScriptsButton.BeginInvoke(new Action(() => {
searchProgressBar.Value += 1;
}));
//smoother if you put the control updates in the UIThread
//same as BeginInvoke if you put the entire logic in UIThread
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (_sender, args) => {
this.UIThread(() => {
searchProgressBar.Value += 1;
});
};
bw.RunWorkerAsync();
*/
public static void UIThread(this Control control, Action code) {
if (control.InvokeRequired) {
control.BeginInvoke(code);
return;
}
code.Invoke();
}
}
}
================================================
FILE: DS_Map/Extensions.cs
================================================
using System;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.ComponentModel;
using Tao.Platform.Windows;
namespace DSPRE {
public static class Extensions {
public static void SetAllItemsChecked(this CheckedListBox clb, bool status) {
for (int i = 0; i < clb.Items.Count; i++) {
clb.SetItemChecked(i, status);
}
}
public static int IndexOfFirstNumber(this string str) {
return str.IndexOfAny("0123456789".ToCharArray());
}
public static bool ContainsNumber(this string str) {
return str.IndexOfFirstNumber() > 0;
}
public static T[] SubArray(this T[] array, int offset, int length) {
T[] result = new T[length];
Array.Copy(array, offset, result, 0, length);
return result;
}
public static void Move(this IList l, int currentIndex, int newIndex) {
T item = l[currentIndex];
l.RemoveAt(currentIndex);
l.Insert(newIndex, item);
}
public static Dictionary Reverse (this Dictionary source) {
var dictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase);
foreach (var entry in source) {
string newKey = entry.Value;
if (!dictionary.ContainsKey(newKey)) {
dictionary.Add(newKey, entry.Key);
}
}
return dictionary;
}
public static void FadeIn(this Form o, int framelength = 16, int frames = 10) {
//Object is not fully invisible. Fade it in
while (o != null && !o.IsDisposed && o.Opacity < 1.0) {
Thread.Sleep(framelength);
o.Opacity += (1.0 / frames);
}
o.Opacity = 1; //make fully visible
}
public static void FadeOut(this Form o, int framelength = 16, int frames = 10) {
//Object is fully visible. Fade it out
while (o != null && o.Opacity > 0.0) {
Thread.Sleep(framelength);
o.Opacity -= (1.0 / frames);
}
o.Opacity = 0; //make fully invisible
Console.WriteLine("Fadeout done");
}
public static byte[] ToByteArrayChooseSize(this int num, byte size) {
switch (size) {
case 1:
return new byte[] { checked((byte)num) };
case 2:
return BitConverter.GetBytes(checked((ushort)num));
case 4:
return BitConverter.GetBytes(num);
default:
MessageBox.Show("Invalid size for number conversion!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw new InvalidOperationException();
}
}
public static string PurgeSpecial(this string str, char[] special) {
foreach (char c in special) {
int pos = str.IndexOf(c);
if (pos >= 0) {
return str.Substring(pos + 1);
}
}
return str;
}
public static NumberStyles GetNumberStyle(this string s) {
int posOfPrefix = s.IndexOf("0x", StringComparison.InvariantCultureIgnoreCase);
if (posOfPrefix >= 0) {
foreach (char c in s.Substring(posOfPrefix + 2)) {
if (!char.IsDigit(c) && char.ToUpper(c) > 'F') {
return NumberStyles.None;
}
}
return NumberStyles.HexNumber;
} else {
foreach (char c in s) {
if (!char.IsDigit(c)) {
return NumberStyles.None;
}
}
return NumberStyles.Integer;
}
}
public static bool IgnoreCaseEquals(this string str, string other) {
return str.Equals(other, StringComparison.InvariantCultureIgnoreCase);
}
public static List ToStringsList (this ScintillaNET.LineCollection lc, bool allowEmpty = true, bool trim = false) {
IEnumerable temp = lc.Select(x => x.Text);
if (trim) {
temp = temp.Select(x => x.Trim());
}
if (!allowEmpty) {
temp = temp.Where(x => !string.IsNullOrEmpty(x));
}
return temp.ToList();
}
//public static Dictionary Reverse(this IDictionary source) {
// var dictionary = new Dictionary();
// foreach (var entry in source) {
// if (!dictionary.ContainsKey(entry.Value)) {
// dictionary.Add(entry.Value, entry.Key);
// }
// }
// return dictionary;
//}
public static Bitmap Resize(this Bitmap source, int width, int height) {
if (source.Width == width && source.Height == height) {
return source;
}
Bitmap result = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(result)) {
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.PixelOffsetMode = PixelOffsetMode.Half;
g.DrawImage(source, 0, 0, width, height);
}
return result;
}
public static Bitmap Resize(this Bitmap source, float factor) => source.Resize((int)(source.Width * factor), (int)(source.Height * factor));
}
public class ListBox2 : ListBox {
public new void RefreshItem(int index) {
base.RefreshItem(index);
}
}
public class SimpleOpenGlControl2 : SimpleOpenGlControl {
private bool designMode;
public SimpleOpenGlControl2() : base() {
designMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime;
}
public new bool DesignMode { get { return designMode; } }
protected override void OnPaint(PaintEventArgs e) {
//if the control is allowed to paint in design mode, a message box prevents working with it
//"No device or rendering context available!"
if (DesignMode) {
e.Graphics.Clear(this.BackColor);
if (this.BackgroundImage != null)
e.Graphics.DrawImage(this.BackgroundImage, this.ClientRectangle, 0, 0, this.BackgroundImage.Width, this.BackgroundImage.Height, GraphicsUnit.Pixel);
e.Graphics.Flush();
return;
};
base.OnPaint(e);
}
}
}
================================================
FILE: DS_Map/Filesystem.cs
================================================
using System.IO;
namespace DSPRE {
public static class Filesystem {
public static string eventFiles => RomInfo.gameDirs[RomInfo.DirNames.eventFiles].unpackedDir;
public static string OWSprites => RomInfo.gameDirs[RomInfo.DirNames.OWSprites].unpackedDir;
public static string mapTextures => RomInfo.gameDirs[RomInfo.DirNames.mapTextures].unpackedDir;
public static string buildingTextures => RomInfo.gameDirs[RomInfo.DirNames.buildingTextures].unpackedDir;
public static string dynamicHeaders => RomInfo.gameDirs[RomInfo.DirNames.dynamicHeaders].unpackedDir;
public static string dynamicHeadersPacked => RomInfo.gameDirs[RomInfo.DirNames.dynamicHeaders].packedDir;
public static string scripts => RomInfo.gameDirs[RomInfo.DirNames.scripts].unpackedDir;
public static string maps => RomInfo.gameDirs[RomInfo.DirNames.maps].unpackedDir;
public static string matrices => RomInfo.gameDirs[RomInfo.DirNames.matrices].unpackedDir;
public static string buildingConfigFiles => RomInfo.gameDirs[RomInfo.DirNames.buildingConfigFiles].unpackedDir;
public static string areaData => RomInfo.gameDirs[RomInfo.DirNames.areaData].unpackedDir;
public static string textArchives => RomInfo.gameDirs[RomInfo.DirNames.textArchives].unpackedDir;
public static string trainerProperties => RomInfo.gameDirs[RomInfo.DirNames.trainerProperties].unpackedDir;
public static string trainerParty => RomInfo.gameDirs[RomInfo.DirNames.trainerParty].unpackedDir;
public static string trainerGraphics => RomInfo.gameDirs[RomInfo.DirNames.trainerGraphics].unpackedDir;
public static string encounters => RomInfo.gameDirs[RomInfo.DirNames.encounters].unpackedDir;
public static string headbutt => RomInfo.gameDirs[RomInfo.DirNames.headbutt].unpackedDir;
public static string safariZone => RomInfo.gameDirs[RomInfo.DirNames.safariZone].unpackedDir;
public static string monIcons => RomInfo.gameDirs[RomInfo.DirNames.monIcons].unpackedDir;
public static string synthOverlay => RomInfo.gameDirs[RomInfo.DirNames.synthOverlay].unpackedDir;
public static string interiorBuildingModels => RomInfo.gameDirs[RomInfo.DirNames.interiorBuildingModels].unpackedDir;
public static string exteriorBuildingModels => RomInfo.gameDirs[RomInfo.DirNames.exteriorBuildingModels].unpackedDir;
public static string GetBuildingModelsDirPath(bool interior) {
if (interior) {
return interiorBuildingModels;
} else {
return exteriorBuildingModels;
}
}
public static string expArmPath => Path.Combine(synthOverlay, PatchToolboxDialog.expandedARMfileID.ToString("D4"));
public static string GetPath(string path, int id, string format = "D4") {
return Path.Combine(path, id.ToString(format));
}
public static string GetPath(string path, string prefix, int id, string ext, string format = "D4") {
return Path.Combine(path, prefix + id.ToString(format) + "." + ext);
}
static string[] GetBuildingModelFiles(bool interior) {
return string.IsNullOrWhiteSpace(Filesystem.GetBuildingModelsDirPath(interior)) ? null : Directory.GetFiles(Filesystem.GetBuildingModelsDirPath(interior));
}
public static string GetBuildingModelPath(bool interior, int id) {
return GetPath(Filesystem.GetBuildingModelsDirPath(interior), id);
}
public static int GetBuildingCount(bool interior) {
return GetBuildingModelFiles(interior).Length;
}
public static string[] GetAreaDataFiles() {
return string.IsNullOrWhiteSpace(Filesystem.areaData) ? null : Directory.GetFiles(Filesystem.areaData);
}
public static string GetAreaDataPath(int id) {
return GetPath(Filesystem.areaData, id);
}
public static int GetAreaDataCount() {
return GetAreaDataFiles().Length;
}
public static string GetTexturePath(bool useMapTiles, int textureID) {
string path = Filesystem.GetMapTexturePath(textureID);
string path2 = Filesystem.GetBuildingTexturePath(textureID);
string tilesetPath = useMapTiles ? path : path2;
return tilesetPath;
}
static string[] GetMapTextureFiles() {
return string.IsNullOrWhiteSpace(Filesystem.mapTextures) ? null : Directory.GetFiles(Filesystem.mapTextures);
}
public static string GetMapTexturePath(int id) {
return GetPath(Filesystem.mapTextures, id);
}
public static int GetMapTexturesCount() {
return GetMapTextureFiles().Length;
}
static string[] GetBuildingTextureFiles() {
return string.IsNullOrWhiteSpace(Filesystem.buildingTextures) ? null : Directory.GetFiles(Filesystem.buildingTextures);
}
public static string GetBuildingTexturePath(int id) {
return GetPath(Filesystem.buildingTextures, id);
}
public static int GetBuildingTexturesCount() {
return GetBuildingTextureFiles().Length;
}
static string[] GetMatrixFiles() {
return string.IsNullOrWhiteSpace(Filesystem.matrices) ? null : Directory.GetFiles(Filesystem.matrices);
}
public static string GetMatrixPath(int id) {
return GetPath(Filesystem.matrices, id);
}
public static int GetMatrixCount() {
return GetMatrixFiles().Length;
}
static string[] GetTextArchiveFiles() {
return string.IsNullOrWhiteSpace(Filesystem.textArchives) ? null : Directory.GetFiles(Filesystem.textArchives);
}
public static string GetTextArchivePath(int id) {
return GetPath(Filesystem.textArchives, id);
}
public static int GetTextArchivesCount() {
return GetTextArchiveFiles().Length;
}
static string[] GetMapFiles() {
return string.IsNullOrWhiteSpace(Filesystem.maps) ? null : Directory.GetFiles(Filesystem.maps);
}
public static string GetMapPath(int id) {
return GetPath(Filesystem.maps, id);
}
public static int GetMapCount() {
return GetMapFiles().Length;
}
static string[] GetScriptFiles() {
return string.IsNullOrWhiteSpace(Filesystem.scripts) ? null : Directory.GetFiles(Filesystem.scripts);
}
public static string GetScriptPath(int id) {
return GetPath(Filesystem.scripts, id);
}
public static int GetScriptCount() {
return GetScriptFiles().Length;
}
static string[] GetEventFiles() {
return string.IsNullOrWhiteSpace(Filesystem.eventFiles) ? null : Directory.GetFiles(Filesystem.eventFiles);
}
public static string GetEventPath(int id) {
return GetPath(Filesystem.eventFiles, id);
}
public static int GetEventFileCount() {
return GetEventFiles().Length;
}
static string[] GetTrainerPropertiesFiles() {
return string.IsNullOrWhiteSpace(Filesystem.trainerProperties) ? null : Directory.GetFiles(Filesystem.trainerProperties);
}
public static string GetTrainerPropertiesPath(int id) {
return GetPath(Filesystem.trainerProperties, id);
}
public static int GetTrainerPropertiesCount() {
return GetTrainerPropertiesFiles().Length;
}
static string[] GetDynamicHeaderFiles() {
return string.IsNullOrWhiteSpace(Filesystem.dynamicHeaders) ? null : Directory.GetFiles(Filesystem.dynamicHeaders);
}
public static string GetDynamicHeaderPath(int id) {
return GetPath(Filesystem.dynamicHeaders, id);
}
public static int GetDynamicHeadersCount() {
return GetDynamicHeaderFiles().Length;
}
static string[] GetEncounterFiles() {
return string.IsNullOrWhiteSpace(Filesystem.encounters) ? null : Directory.GetFiles(Filesystem.encounters);
}
public static string GetEncounterPath(int id) {
return GetPath(Filesystem.encounters, id);
}
public static int GetEncountersCount() {
return GetEncounterFiles().Length;
}
static string[] GetSafariZoneFiles() {
return string.IsNullOrWhiteSpace(Filesystem.safariZone) ? null : Directory.GetFiles(Filesystem.safariZone);
}
public static string GetSafariZonePath(int id) {
return GetPath(Filesystem.safariZone, id);
}
public static int GetSafariZoneCount() {
return GetSafariZoneFiles().Length;
}
static string[] GetHeadbuttFiles() {
return string.IsNullOrWhiteSpace(Filesystem.headbutt) ? null : Directory.GetFiles(Filesystem.headbutt);
}
public static string GetHeadbuttPath(int id) {
return GetPath(Filesystem.headbutt, id);
}
public static int GetHeadbuttCount() {
return GetHeadbuttFiles().Length;
}
public static string GetOWSpritePath(int id) {
return GetPath(Filesystem.OWSprites, id);
}
public static string GetBuildingConfigPath(int id) {
return GetPath(Filesystem.buildingConfigFiles, id);
}
public static string GetTrainerPartyPath(int id) {
return GetPath(Filesystem.trainerParty, id);
}
public static string GetTrainerGraphicsPath(int id) {
return GetPath(Filesystem.trainerGraphics, id);
}
public static string GetMonIconPath(int id, string format = "D4") {
return GetPath(Filesystem.monIcons, id, format);
}
public static string GetSynthOerlayPath(int id) {
return GetPath(Filesystem.synthOverlay, id);
}
}
}
================================================
FILE: DS_Map/GameCamera.cs
================================================
using DSPRE;
using System;
using System.IO;
using System.Windows.Forms;
using static DSPRE.RomInfo;
public class GameCamera {
public const byte PERSPECTIVE = 0;
public const byte ORTHO = 1;
public uint distance { get; set; }
public short vertRot { get; private set; }
public short horiRot { get; private set; }
public short zRot { get; private set; }
public short unk1 { get; private set; }
public byte perspMode { get; private set; }
public byte unk2 { get; private set; }
public ushort fov { get; private set; }
public uint nearClip { get; private set; }
public uint farClip { get; private set; }
public int? xOffset { get; private set; }
public int? yOffset { get; private set; }
public int? zOffset { get; private set; }
public object this[int index] {
get {
switch (index) {
case 0:
return distance;
case 1:
return vertRot;
case 2:
return horiRot;
case 3:
return zRot;
case 4:
return perspMode;
case 5:
return fov;
case 6:
return nearClip;
case 7:
return farClip;
case 8:
return xOffset;
case 9:
return yOffset;
case 10:
return zOffset;
default:
throw new ArgumentOutOfRangeException();
}
}
set {
try {
switch (index) {
case 0:
distance = Convert.ToUInt32(value);
break;
case 1:
vertRot = Convert.ToInt16(value);
break;
case 2:
horiRot = Convert.ToInt16(value);
break;
case 3:
zRot = Convert.ToInt16(value);
break;
case 4:
perspMode = (byte)(Convert.ToBoolean(value) ? 1 : 0);
break;
case 5:
fov = Convert.ToUInt16(value);
break;
case 6:
nearClip = Convert.ToUInt32(value);
break;
case 7:
farClip = Convert.ToUInt32(value);
break;
case 8:
xOffset = Convert.ToInt32(value);
break;
case 9:
yOffset = Convert.ToInt32(value);
break;
case 10:
zOffset = Convert.ToInt32(value);
break;
}
} catch (OverflowException e) {
MessageBox.Show("The value you selected is invalid.\n\n" + '"' + e.Message + '"', "Overflow", MessageBoxButtons.OK, MessageBoxIcon.Error);
} catch (FormatException) {
MessageBox.Show("Only numeric values are allowed.", "Invalid input", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public GameCamera(uint distance = 0x29AEC1, short vertRot = 0xD62, short horiRot = 0, short zRot = 0,
short unk1 = 0, byte perspMode = PERSPECTIVE, byte unk2 = 0,
ushort fov = 1473, uint nearClip = 614400, uint farClip = 0x384000,
int? xOffset = null, int? yOffset = null, int? zOffset = null) {
this.distance = distance;
this.vertRot = vertRot;
this.horiRot = horiRot;
this.zRot = zRot;
this.unk1 = unk1;
this.perspMode = perspMode;
this.unk2 = unk2;
this.fov = fov;
this.nearClip = nearClip;
this.farClip = farClip;
this.xOffset = xOffset;
this.yOffset = yOffset;
this.zOffset = zOffset;
}
public GameCamera(byte[] camData) {
if (camData.Length != 36 && camData.Length != 24) {
MessageBox.Show("This is not a camera file.\nMake sure the file is 36 or 24 bytes long and try again.", "Wrong file!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try {
using (BinaryReader b = new BinaryReader(new MemoryStream(camData))) {
distance = b.ReadUInt32();
vertRot = b.ReadInt16();
horiRot = b.ReadInt16();
zRot = b.ReadInt16();
unk1 = b.ReadInt16();
perspMode = b.ReadByte();
unk2 = b.ReadByte();
fov = b.ReadUInt16();
nearClip = b.ReadUInt32();
farClip = b.ReadUInt32();
if (RomInfo.gameFamily == GameFamilies.HGSS) {
xOffset = b.ReadInt32();
yOffset = b.ReadInt32();
zOffset = b.ReadInt32();
}
}
} catch (EndOfStreamException) {
MessageBox.Show("You might have to manually fill in the last three camera fields, since DPPt cameras don't have them.", "DPPt Cam detected", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
public byte[] ToByteArray() {
MemoryStream newData = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(newData)) {
writer.Write(distance);
writer.Write(vertRot);
writer.Write(horiRot);
writer.Write(zRot);
writer.Write(unk1);
writer.Write(perspMode);
writer.Write(unk2);
writer.Write(fov);
writer.Write(nearClip);
writer.Write(farClip);
if (xOffset != null) {
writer.Write((int)xOffset);
}
if (yOffset != null) {
writer.Write((int)yOffset);
}
if (zOffset != null) {
writer.Write((int)zOffset);
}
}
return newData.ToArray();
}
public void ShowInGridView(DataGridView dgv, int rowIndex) {
if (rowIndex > dgv.Rows.Count - 1) {
dgv.Rows.Add();
}
int colIndex = 0;
dgv.Rows[rowIndex].HeaderCell.Value = String.Format("{0}", dgv.Rows[rowIndex].Index);
dgv.Rows[rowIndex].Cells[colIndex++].Value = distance;
dgv.Rows[rowIndex].Cells[colIndex++].Value = vertRot;
dgv.Rows[rowIndex].Cells[colIndex++].Value = horiRot;
dgv.Rows[rowIndex].Cells[colIndex++].Value = zRot;
dgv.Rows[rowIndex].Cells[colIndex++].Value = perspMode == ORTHO;
dgv.Rows[rowIndex].Cells[colIndex++].Value = fov;
dgv.Rows[rowIndex].Cells[colIndex++].Value = nearClip;
dgv.Rows[rowIndex].Cells[colIndex++].Value = farClip;
if (colIndex < dgv.Columns.Count-3) {
if (xOffset != null) {
dgv.Rows[rowIndex].Cells[colIndex++].Value = xOffset;
}
if (yOffset != null) {
dgv.Rows[rowIndex].Cells[colIndex++].Value = yOffset;
}
if (zOffset != null) {
dgv.Rows[rowIndex].Cells[colIndex++].Value = zOffset;
}
}
}
}
================================================
FILE: DS_Map/HeaderSearch.Designer.cs
================================================
namespace DSPRE {
partial class HeaderSearch {
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
this.arm9expansionTextLBL = new System.Windows.Forms.Label();
this.fieldToSearch1ComboBox = new System.Windows.Forms.ComboBox();
this.explanationLabel = new System.Windows.Forms.Label();
this.operator1ComboBox = new System.Windows.Forms.ComboBox();
this.valueTextBox = new System.Windows.Forms.TextBox();
this.startSearchButton = new System.Windows.Forms.Button();
this.headerSearchResetButton = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.autoSearchCB = new System.Windows.Forms.CheckBox();
this.SuspendLayout();
//
// arm9expansionTextLBL
//
this.arm9expansionTextLBL.Location = new System.Drawing.Point(0, -10);
this.arm9expansionTextLBL.Name = "arm9expansionTextLBL";
this.arm9expansionTextLBL.Size = new System.Drawing.Size(100, 23);
this.arm9expansionTextLBL.TabIndex = 15;
//
// fieldToSearch1ComboBox
//
this.fieldToSearch1ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.fieldToSearch1ComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.fieldToSearch1ComboBox.FormattingEnabled = true;
this.fieldToSearch1ComboBox.Location = new System.Drawing.Point(11, 27);
this.fieldToSearch1ComboBox.Name = "fieldToSearch1ComboBox";
this.fieldToSearch1ComboBox.Size = new System.Drawing.Size(190, 24);
this.fieldToSearch1ComboBox.TabIndex = 6;
this.fieldToSearch1ComboBox.SelectedIndexChanged += new System.EventHandler(this.fieldToSearch1ComboBox_SelectedIndexChanged);
//
// explanationLabel
//
this.explanationLabel.AutoSize = true;
this.explanationLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.explanationLabel.Location = new System.Drawing.Point(8, 9);
this.explanationLabel.Name = "explanationLabel";
this.explanationLabel.Size = new System.Drawing.Size(111, 15);
this.explanationLabel.TabIndex = 7;
this.explanationLabel.Text = "Header Property";
//
// operator1ComboBox
//
this.operator1ComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.operator1ComboBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.operator1ComboBox.FormattingEnabled = true;
this.operator1ComboBox.Location = new System.Drawing.Point(11, 82);
this.operator1ComboBox.Name = "operator1ComboBox";
this.operator1ComboBox.Size = new System.Drawing.Size(190, 24);
this.operator1ComboBox.TabIndex = 8;
this.operator1ComboBox.SelectedIndexChanged += new System.EventHandler(this.operator1ComboBox_SelectedIndexChanged);
//
// valueTextBox
//
this.valueTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.valueTextBox.Location = new System.Drawing.Point(11, 110);
this.valueTextBox.MaxLength = 16;
this.valueTextBox.Name = "valueTextBox";
this.valueTextBox.Size = new System.Drawing.Size(190, 22);
this.valueTextBox.TabIndex = 9;
this.valueTextBox.KeyUp += new System.Windows.Forms.KeyEventHandler(this.valueTextBox_KeyUp);
//
// startSearchButton
//
this.startSearchButton.Image = global::DSPRE.Properties.Resources.wideLensImage;
this.startSearchButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.startSearchButton.Location = new System.Drawing.Point(209, 11);
this.startSearchButton.Name = "startSearchButton";
this.startSearchButton.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.startSearchButton.Size = new System.Drawing.Size(86, 43);
this.startSearchButton.TabIndex = 16;
this.startSearchButton.Text = "Start\r\nSearch";
this.startSearchButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.startSearchButton.UseVisualStyleBackColor = true;
this.startSearchButton.Click += new System.EventHandler(this.startSearchButton_Click);
//
// headerSearchResetButton
//
this.headerSearchResetButton.Image = global::DSPRE.Properties.Resources.wideLensImageTransp;
this.headerSearchResetButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.headerSearchResetButton.Location = new System.Drawing.Point(209, 60);
this.headerSearchResetButton.Name = "headerSearchResetButton";
this.headerSearchResetButton.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.headerSearchResetButton.Size = new System.Drawing.Size(86, 43);
this.headerSearchResetButton.TabIndex = 17;
this.headerSearchResetButton.Text = "Reset\r\nResults";
this.headerSearchResetButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.headerSearchResetButton.UseVisualStyleBackColor = true;
this.headerSearchResetButton.Click += new System.EventHandler(this.headerSearchResetButton_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(8, 64);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(54, 15);
this.label1.TabIndex = 18;
this.label1.Text = "Criteria";
//
// autoSearchCB
//
this.autoSearchCB.AutoSize = true;
this.autoSearchCB.Checked = true;
this.autoSearchCB.CheckState = System.Windows.Forms.CheckState.Checked;
this.autoSearchCB.Location = new System.Drawing.Point(212, 113);
this.autoSearchCB.Name = "autoSearchCB";
this.autoSearchCB.Size = new System.Drawing.Size(82, 17);
this.autoSearchCB.TabIndex = 19;
this.autoSearchCB.Text = "AutoSearch";
this.autoSearchCB.UseVisualStyleBackColor = true;
//
// HeaderSearch
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.ClientSize = new System.Drawing.Size(304, 144);
this.Controls.Add(this.autoSearchCB);
this.Controls.Add(this.label1);
this.Controls.Add(this.headerSearchResetButton);
this.Controls.Add(this.startSearchButton);
this.Controls.Add(this.valueTextBox);
this.Controls.Add(this.operator1ComboBox);
this.Controls.Add(this.explanationLabel);
this.Controls.Add(this.fieldToSearch1ComboBox);
this.Controls.Add(this.arm9expansionTextLBL);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "HeaderSearch";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Advanced Header Search (Experimental)";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label arm9expansionTextLBL;
private System.Windows.Forms.ComboBox fieldToSearch1ComboBox;
private System.Windows.Forms.Label explanationLabel;
private System.Windows.Forms.ComboBox operator1ComboBox;
private System.Windows.Forms.TextBox valueTextBox;
private System.Windows.Forms.Button startSearchButton;
private System.Windows.Forms.Button headerSearchResetButton;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.CheckBox autoSearchCB;
}
}
================================================
FILE: DS_Map/HeaderSearch.cs
================================================
using DSPRE.ROMFiles;
using System.Collections.Generic;
using System;
using System.Windows.Forms;
using static DSPRE.RomInfo;
using System.Reflection;
using System.Linq;
namespace DSPRE {
public partial class HeaderSearch : Form {
public static readonly Dictionary searchableHeaderFieldsDict = new Dictionary() {
[MapHeader.SearchableFields.AreaDataID] = "Area Data (ID)",
[MapHeader.SearchableFields.CameraAngleID] = "Camera Angle (ID)",
[MapHeader.SearchableFields.EventFileID] = "Event File (ID)",
[MapHeader.SearchableFields.InternalName] = "Internal Name",
[MapHeader.SearchableFields.LevelScriptID] = "Level Script (ID)",
[MapHeader.SearchableFields.MatrixID] = "Matrix (ID)",
[MapHeader.SearchableFields.MusicDayID] = "Music Day (ID)",
//[MapHeader.SearchableFields.MusicDayName] = "Music Day (Name)",
[MapHeader.SearchableFields.MusicNightID] = "Music Night (ID)",
//[MapHeader.SearchableFields.MusicNightName] = "Music Night (Name)",
[MapHeader.SearchableFields.ScriptFileID] = "Script File (ID)",
[MapHeader.SearchableFields.TextArchiveID] = "Text Archive (ID)",
[MapHeader.SearchableFields.WeatherID] = "Weather (ID)"
};
public enum NumOperators : byte {
//Order matters!
Equal,
Different,
Less,
Greater,
LessOrEqual,
GreaterOrEqual
};
public enum TextOperators : byte {
//Order matters!
Contains,
DoesNotContain,
IsExactly,
IsNot
};
private static readonly Dictionary numOperatorsDict = new Dictionary() {
//Order matters!
[NumOperators.Equal] = "Equals",
[NumOperators.Different] = "Is Different than",
[NumOperators.Less] = "Is Less than",
[NumOperators.Greater] = "Is Greater than",
[NumOperators.LessOrEqual] = "Is Less than or Equal to",
[NumOperators.GreaterOrEqual] = "Is Greater than or Equal to",
};
private static readonly Dictionary textOperatorsDict = new Dictionary() {
//Order matters!
[TextOperators.Contains] = "Contains",
[TextOperators.DoesNotContain] = "Does not contain",
[TextOperators.IsExactly] = "Is Exactly",
[TextOperators.IsNot] = "Is Not",
};
private List intNames;
private ListBox headerListBox;
private ToolStripStatusLabel statusLabel;
public string status = "Ready";
public HeaderSearch(ref List internalNames, ListBox headerListBox, ToolStripStatusLabel statusLabel) {
InitializeComponent();
intNames = internalNames;
this.headerListBox = headerListBox;
this.statusLabel = statusLabel;
foreach (string elem in searchableHeaderFieldsDict.Values) {
fieldToSearch1ComboBox.Items.Add(elem);
}
fieldToSearch1ComboBox.SelectedIndex = 0;
operator1ComboBox.SelectedIndex = 0;
}
#region Helper Methods
private void UpdateOperators(ComboBox operatorComboBox, ComboBox fieldToSearchComboBox) {
operatorComboBox.Items.Clear();
if (fieldToSearchComboBox.SelectedItem.ToString().Contains("ID")) {
foreach (string elem in numOperatorsDict.Values) {
operatorComboBox.Items.Add(elem);
}
valueTextBox.MaxLength = 5;
} else {
foreach (string elem in textOperatorsDict.Values) {
operatorComboBox.Items.Add(elem);
}
valueTextBox.MaxLength = 16;
}
operatorComboBox.SelectedIndex = 0;
}
#endregion
public static void ResetResults(ListBox headerListBox, List intNames, bool prependNumbers) {
if (headerListBox.Items.Count < intNames.Count) {
headerListBox.Enabled = true;
headerListBox.Items.Clear();
if (prependNumbers) {
for (int i = 0; i < intNames.Count; i++) {
string name = intNames[i];
headerListBox.Items.Add(i.ToString("D3") + MapHeader.nameSeparator + name);
}
} else {
headerListBox.Items.AddRange(intNames.ToArray());
}
}
}
public static HashSet AdvancedSearch(ushort startID, ushort finalID, List intNames, int fieldToSearch, int oper, string valToSearch) {
if (fieldToSearch < 0 || oper < 0 || valToSearch == "") {
return null;
}
HashSet result = new HashSet();
switch (fieldToSearch) {
case (int)MapHeader.SearchableFields.InternalName:
for (ushort i = startID; i < finalID; i++) {
switch (oper) {
case (int)TextOperators.IsExactly:
if (intNames[i].Equals(valToSearch)) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)TextOperators.IsNot:
if (!intNames[i].Equals(valToSearch)) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)TextOperators.Contains:
if (intNames[i].IndexOf(valToSearch, StringComparison.InvariantCultureIgnoreCase) >= 0) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)TextOperators.DoesNotContain:
if (intNames[i].IndexOf(valToSearch, StringComparison.InvariantCultureIgnoreCase) < 0) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
default:
Console.WriteLine("Unrecognized operand!!!");
break;
}
}
break;
//case (int)MapHeader.SearchableFields.MusicDayName:
//Maybe in the future
//break;
//case (int)MapHeader.SearchableFields.MusicNightName:
//Maybe in the future
//break;
default:
string[] fieldSplit = searchableHeaderFieldsDict[(MapHeader.SearchableFields)fieldToSearch].Split();
fieldSplit[0] = fieldSplit[0].ToLower();
fieldSplit[fieldSplit.Length - 1] = fieldSplit[fieldSplit.Length - 1].Replace("(", "").Replace(")", ""); //Remove ( and ) from string
PropertyInfo property = typeof(MapHeader).GetProperty(String.Join("", fieldSplit));
ushort numToSearch;
try {
numToSearch = ushort.Parse(valToSearch);
} catch (OverflowException) {
MessageBox.Show("Your input exceeds the range of 16-bit integers (" + ushort.MinValue + " - " + ushort.MaxValue + ").", "Overflow Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
return null;
}
for (ushort i = startID; i < finalID; i++) {
MapHeader h;
if (PatchToolboxDialog.flag_DynamicHeadersPatchApplied || PatchToolboxDialog.CheckFilesDynamicHeadersPatchApplied()) {
h = MapHeader.LoadFromFile(RomInfo.gameDirs[DirNames.dynamicHeaders].unpackedDir + "\\" + i.ToString("D4"), i, 0);
} else {
h = MapHeader.LoadFromARM9(i);
}
int headerField = int.Parse(property.GetValue(h, null).ToString());
switch (oper) {
case (int)NumOperators.Less:
if (headerField < numToSearch) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)NumOperators.Equal:
if (headerField == numToSearch) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)NumOperators.Greater:
if (headerField > numToSearch) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)NumOperators.LessOrEqual:
if (headerField <= numToSearch) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)NumOperators.GreaterOrEqual:
if (headerField >= numToSearch) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
case (int)NumOperators.Different:
if (headerField != numToSearch) {
result.Add(i.ToString("D3") + MapHeader.nameSeparator + intNames[i]);
}
break;
default:
Console.WriteLine("Unrecognized operand!!!");
break;
}
}
break;
}
return result;
}
private void startSearchButton_Click(object sender, EventArgs e) {
StartSearch(showDialog: true);
}
private void StartSearch(bool showDialog = true) {
if (valueTextBox.Text == "") {
//if (showDialog) {
// MessageBox.Show("Value to search is empty", "Can't search", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
//}
headerSearchResetButton_Click(null, null);
return;
}
HashSet result;
headerListBox.Items.Clear();
try {
result = AdvancedSearch(0, (ushort)intNames.Count, intNames, fieldToSearch1ComboBox.SelectedIndex, operator1ComboBox.SelectedIndex, valueTextBox.Text);
} catch (FormatException) {
if (showDialog) {
MessageBox.Show("Make sure the value to search is correct.", "Format Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
valueTextBox.Clear();
headerListBox.Items.Add("Search parameters are invalid");
headerListBox.Enabled = false;
return;
}
string searchConfiguration = fieldToSearch1ComboBox.Text + " " + operator1ComboBox.Text.ToLower() + " " + '"' + valueTextBox.Text + '"';
if (result is null || result.Count <= 0) {
string res = "No header's " + searchConfiguration;
headerListBox.Items.Add(res);
headerListBox.Enabled = false;
statusLabel.Text = res;
} else {
string[] arr = new string[result.Count];
result.CopyTo(arr);
headerListBox.Items.AddRange(arr);
headerListBox.SelectedIndex = 0;
headerListBox.Enabled = true;
statusLabel.Text = "Showing headers whose " + searchConfiguration;
}
Update();
}
private void valueTextBox_KeyUp(object sender, KeyEventArgs e) {
if (autoSearchCB.Checked) {
StartSearch(showDialog: false);
} else if (e.KeyCode == Keys.Enter) {
StartSearch(showDialog: true);
}
}
private void headerSearchResetButton_Click(object sender, EventArgs e) {
ResetResults(headerListBox, intNames, prependNumbers: true);
valueTextBox.Clear();
statusLabel.Text = "Ready";
}
private void fieldToSearch1ComboBox_SelectedIndexChanged(object sender, EventArgs e) {
UpdateOperators(operator1ComboBox, fieldToSearch1ComboBox);
if (autoSearchCB.Checked) {
StartSearch(showDialog: false);
}
}
private void operator1ComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (autoSearchCB.Checked) {
StartSearch(showDialog: false);
}
}
}
}
================================================
FILE: DS_Map/HeaderSearch.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
================================================
FILE: DS_Map/Helpers.cs
================================================
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
using LibNDSFormats.NSBMD;
using LibNDSFormats.NSBTX;
using DSPRE.ROMFiles;
using Images;
using Ekona.Images;
using ScintillaNET;
using ScintillaNET.Utils;
using Tao.Platform.Windows;
using NSMBe4.DSFileSystem;
namespace DSPRE {
public static class Helpers {
static MainProgram MainProgram;
public static RomInfo romInfo;
public static bool hideBuildings = new bool();
public static NSBMDGlRenderer mapRenderer;
public static ToolStripProgressBar toolStripProgressBar { get { return MainProgram.toolStripProgressBar; } }
public static void Initialize(MainProgram mainProgram) {
MainProgram = mainProgram;
mapRenderer = new NSBMDGlRenderer();
}
static bool disableHandlersOld;
static bool disableHandlers;
public static bool HandlersDisabled { get { return disableHandlers == true; } }
public static bool HandlersEnabled { get { return disableHandlers == false; } }
public static void BackUpDisableHandler() {
disableHandlersOld = disableHandlers;
}
public static void RestoreDisableHandler() {
disableHandlers = disableHandlersOld;
}
public static void DisableHandlers() {
disableHandlers = true;
}
public static void EnableHandlers() {
disableHandlers = false;
}
public static void statusLabelMessage(string msg = "Ready") {
ToolStripStatusLabel statusLabel = MainProgram.statusLabel;
statusLabel.Text = msg;
statusLabel.Font = new Font(statusLabel.Font, FontStyle.Regular);
statusLabel.ForeColor = Color.Black;
statusLabel.Invalidate();
}
public static void statusLabelError(string errorMsg, bool severe = true) {
ToolStripStatusLabel statusLabel = MainProgram.statusLabel;
statusLabel.Text = errorMsg;
statusLabel.Font = new Font(statusLabel.Font, FontStyle.Bold);
statusLabel.ForeColor = severe ? Color.Red : Color.DarkOrange;
statusLabel.Invalidate();
}
//Locate File - buttons
public static void ExplorerSelect(string path) {
if (System.IO.File.Exists(path)) {
Process.Start("explorer.exe", "/select" + "," + "\"" + path + "\"");
}
}
public static string[] GetTrainerNames() {
List trainerList = new List();
/* Store all trainer names and classes */
TextArchive trainerClasses = new TextArchive(RomInfo.trainerClassMessageNumber);
TextArchive trainerNames = new TextArchive(RomInfo.trainerNamesMessageNumber);
int trainerCount = Filesystem.GetTrainerPropertiesCount();
for (int i = 0; i < trainerCount; i++) {
string path = Filesystem.GetTrainerPropertiesPath(i);
int classMessageID = BitConverter.ToUInt16(DSUtils.ReadFromFile(path, startOffset: 1, 2), 0);
string currentTrainerName;
if (i < trainerNames.messages.Count) {
currentTrainerName = trainerNames.messages[i];
} else {
currentTrainerName = TrainerFile.NAME_NOT_FOUND;
}
trainerList.Add("[" + i.ToString("D2") + "] " + trainerClasses.messages[classMessageID] + " " + currentTrainerName);
}
return trainerList.ToArray();
}
public static void MW_LoadModelTextures(NSBMD model, string textureFolder, int fileID) {
if (fileID < 0) {
return;
}
string texturePath = Filesystem.GetPath(textureFolder, fileID);
model.materials = NSBTXLoader.LoadNsbtx(new MemoryStream(System.IO.File.ReadAllBytes(texturePath)), out model.Textures, out model.Palettes);
try {
model.MatchTextures();
} catch {
}
}
public static void MW_LoadModelTextures(MapFile mapFile, int fileID) {
MW_LoadModelTextures(mapFile.mapModel, Filesystem.mapTextures, fileID);
}
public static void MW_LoadModelTextures(Building building, int fileID) {
MW_LoadModelTextures(building.NSBMDFile, Filesystem.buildingTextures, fileID);
}
public static void SetupRenderer(float ang, float dist, float elev, float perspective, int width, int height) {
//TODO: improve this
Gl.glEnable(Gl.GL_RESCALE_NORMAL);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_NORMALIZE);
Gl.glDisable(Gl.GL_CULL_FACE);
Gl.glFrontFace(Gl.GL_CCW);
Gl.glClearDepth(1);
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
Gl.glEnable(Gl.GL_BLEND);
Gl.glAlphaFunc(Gl.GL_GREATER, 0f);
Gl.glClearColor(51f / 255f, 51f / 255f, 51f / 255f, 1f);
Gl.glViewport(0, 0, width, height);
float aspect = width / height; //(vp[2] - vp[0]) / (vp[3] - vp[1]);
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(perspective, aspect, 0.2f, 500.0f); //0.02f, 32.0f);
Gl.glTranslatef(0, 0, -dist);
Gl.glRotatef(elev, 1, 0, 0);
Gl.glRotatef(ang, 0, 1, 0);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glTranslatef(0, 0, -dist);
Gl.glRotatef(elev, 1, 0, 0);
Gl.glRotatef(-ang, 0, 1, 0);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLoadIdentity();
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
Gl.glColor3f(1.0f, 1.0f, 1.0f);
Gl.glDepthMask(Gl.GL_TRUE);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
}
public static void RenderMap(ref MapFile mapFile, int width, int height, float ang, float dist, float elev, float perspective, bool mapTexturesON = true, bool buildingTexturesON = true) {
#region Useless variables that the rendering API still needs
MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File ani = new MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File();
MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File tp = new MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File();
MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File ca = new MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File();
int[] aniframeS = new int[0];
#endregion
/* Adjust rendering settings */
SetupRenderer(ang, dist, elev, perspective, width, height);
/* Render the map model */
NSBMD model = mapFile.mapModel;
mapRenderer.Model = model.models[0];
// int scale = 64;
float scale = 0.015625f;
Gl.glScalef(mapRenderer.Model.modelScale * scale, mapRenderer.Model.modelScale * scale, mapRenderer.Model.modelScale * scale);
/* Determine if map textures must be rendered */
if (mapTexturesON) {
Gl.glEnable(Gl.GL_TEXTURE_2D);
} else {
Gl.glDisable(Gl.GL_TEXTURE_2D);
}
// Render map model
mapRenderer.RenderModel("", ani, aniframeS, aniframeS, aniframeS, aniframeS, aniframeS, ca, false, -1, 0.0f, 0.0f, dist, elev, ang, true, tp, model);
if (hideBuildings) {
return;
}
if (buildingTexturesON) {
Gl.glEnable(Gl.GL_TEXTURE_2D);
} else {
Gl.glDisable(Gl.GL_TEXTURE_2D);
}
for (int i = 0; i < mapFile.buildings.Count; i++) {
Building building = mapFile.buildings[i];
model = building.NSBMDFile;
if (model is null) {
Console.WriteLine("Null building can't be rendered");
} else {
mapRenderer.Model = model.models[0];
ScaleTranslateRotateBuilding(building);
mapRenderer.RenderModel("", ani, aniframeS, aniframeS, aniframeS, aniframeS, aniframeS, ca, false, -1, 0.0f, 0.0f, dist, elev, ang, true, tp, model);
}
}
}
public static Bitmap GrabMapScreenshot(int width, int height) {
Bitmap bmp = new Bitmap(width, height);
System.Drawing.Imaging.BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Gl.glReadPixels(0, 0, width, height, Gl.GL_BGR, Gl.GL_UNSIGNED_BYTE, data.Scan0);
bmp.UnlockBits(data);
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
return bmp;
}
private static void ScaleTranslateRotateBuilding(Building building) {
float fullXcoord = building.xPosition + building.xFraction / 65536f;
float fullYcoord = building.yPosition + building.yFraction / 65536f;
float fullZcoord = building.zPosition + building.zFraction / 65536f;
float scaleFactor = building.NSBMDFile.models[0].modelScale / 1024;
float translateFactor = 256 / building.NSBMDFile.models[0].modelScale;
Gl.glScalef(scaleFactor * building.width, scaleFactor * building.height, scaleFactor * building.length);
Gl.glTranslatef(fullXcoord * translateFactor / building.width, fullYcoord * translateFactor / building.height, fullZcoord * translateFactor / building.length);
Gl.glRotatef(Building.U16ToDeg(building.xRotation), 1, 0, 0);
Gl.glRotatef(Building.U16ToDeg(building.yRotation), 0, 1, 0);
Gl.glRotatef(Building.U16ToDeg(building.zRotation), 0, 0, 1);
}
public static Image GetPokePic(int species, int w, int h, PaletteBase paletteBase, ImageBase imageBase, SpriteBase spriteBase) {
bool fiveDigits = false; // some extreme future proofing
try {
string path = Filesystem.GetMonIconPath(0);
paletteBase = new NCLR(path, 0, Path.GetFileName(path));
} catch (FileNotFoundException) {
string path = Filesystem.GetMonIconPath(0, "D5");
paletteBase = new NCLR(path, 0, Path.GetFileName(path));
fiveDigits = true;
}
// read arm9 table to grab pal ID
int paletteId = 0;
byte[] iconPalTableBuf;
switch (RomInfo.gameFamily) {
case RomInfo.GameFamilies.DP:
iconPalTableBuf = ARM9.ReadBytes(0x6B838, 4);
break;
case RomInfo.GameFamilies.Plat:
iconPalTableBuf = ARM9.ReadBytes(0x79F80, 4);
break;
case RomInfo.GameFamilies.HGSS:
default:
iconPalTableBuf = ARM9.ReadBytes(0x74408, 4);
break;
}
int iconPalTableAddress = (iconPalTableBuf[3] & 0xFF) << 24 | (iconPalTableBuf[2] & 0xFF) << 16 | (iconPalTableBuf[1] & 0xFF) << 8 | (iconPalTableBuf[0] & 0xFF) /* << 0 */;
string iconTablePath;
int iconPalTableOffsetFromFileStart;
if (iconPalTableAddress >= RomInfo.synthOverlayLoadAddress) {
// if the pointer shows the table was moved to the synthetic overlay
iconPalTableOffsetFromFileStart = iconPalTableAddress - (int)RomInfo.synthOverlayLoadAddress;
iconTablePath = Filesystem.expArmPath;
} else {
iconPalTableOffsetFromFileStart = iconPalTableAddress - 0x02000000;
iconTablePath = RomInfo.arm9Path;
}
using (DSUtils.EasyReader idReader = new DSUtils.EasyReader(iconTablePath, iconPalTableOffsetFromFileStart + species)) {
paletteId = idReader.ReadByte();
}
if (paletteId != 0) {
paletteBase.Palette[0] = paletteBase.Palette[paletteId]; // update pal 0 to be the new pal
}
// grab tiles
int spriteFileID = species + 7;
if (fiveDigits) {
string path = Filesystem.GetMonIconPath(spriteFileID, "D5");
imageBase = new NCGR(path, spriteFileID, Path.GetFileName(path));
} else {
string path = Filesystem.GetMonIconPath(spriteFileID);
imageBase = new NCGR(path, spriteFileID, Path.GetFileName(path));
}
// grab sprite
const int ncerFileId = 2;
if (fiveDigits) {
string path = Filesystem.GetMonIconPath(ncerFileId, "D5");
spriteBase = new NCER(path, ncerFileId, Path.GetFileName(path));
} else {
string path = Filesystem.GetMonIconPath(ncerFileId);
spriteBase = new NCER(path, ncerFileId, Path.GetFileName(path));
}
// copy this from the trainer
int bank0OAMcount = spriteBase.Banks[0].oams.Length;
int[] OAMenabled = new int[bank0OAMcount];
for (int i = 0; i < OAMenabled.Length; i++) {
OAMenabled[i] = i;
}
// finally compose image
try {
return spriteBase.Get_Image(imageBase, paletteBase, 0, w, h, false, false, false, true, true, -1, OAMenabled);
} catch (FormatException) {
return Properties.Resources.IconPokeball;
}
// default:
//partyPokemonPictureBoxList[partyPos].Image = cb.SelectedIndex > 0 ? (Image)Properties.PokePics.ResourceManager.GetObject(FixPokenameString(PokeDatabase.System.pokeNames[(ushort)cb.SelectedIndex])) : global::DSPRE.Properties.Resources.IconPokeball;
}
public static void GenerateKeystrokes(string keys, Scintilla textArea) {
//Example
//GenerateKeystrokes("+{TAB}");
HotKeyManager.Enable = false;
textArea.Focus();
SendKeys.Send(keys);
HotKeyManager.Enable = true;
}
public static void PictureBoxDisable(object sender, PaintEventArgs e) {
if (sender is PictureBox pict && pict.Image != null && (!pict.Enabled)) {
using (Bitmap img = new Bitmap(pict.Image, pict.ClientSize)) {
ControlPaint.DrawImageDisabled(e.Graphics, img, 0, 0, pict.BackColor);
}
}
}
public static List getHeaderListBoxNames() {
if (string.IsNullOrWhiteSpace(RomInfo.internalNamesPath)) {
return null;
}
List headerListBoxNames = new List();
using (DSUtils.EasyReader reader = new DSUtils.EasyReader(RomInfo.internalNamesPath)) {
int headerCount = RomInfo.GetHeaderCount();
for (int i = 0; i < headerCount; i++) {
byte[] row = reader.ReadBytes(RomInfo.internalNameLength);
string internalName = Encoding.ASCII.GetString(row); //.TrimEnd();
headerListBoxNames.Add(MapHeader.BuildName(i, internalName));
}
}
return headerListBoxNames;
}
public static List getInternalNames() {
List internalNames = new List();
using (DSUtils.EasyReader reader = new DSUtils.EasyReader(RomInfo.internalNamesPath)) {
int headerCount = RomInfo.GetHeaderCount();
for (int i = 0; i < headerCount; i++) {
byte[] row = reader.ReadBytes(RomInfo.internalNameLength);
string internalName = Encoding.ASCII.GetString(row); //.TrimEnd();
internalNames.Add(internalName.TrimEnd('\0'));
}
}
return internalNames;
}
}
}
================================================
FILE: DS_Map/InputComboBox.cs
================================================
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace DSPRE {
public partial class InputComboBox : ComboBox {
private Color normalColor;
public InputComboBox() {
normalColor = this.BackColor;
DropDownStyle = ComboBoxStyle.DropDown;
AutoCompleteMode = AutoCompleteMode.SuggestAppend;
AutoCompleteSource = AutoCompleteSource.ListItems;
}
private void UpdateText() {
string input = Text;
int index = FindStringExact(input.Trim());
if (index == -1) {
this.BackColor = Color.IndianRed;
} else {
this.BackColor = normalColor;
SelectedIndex = index;
}
}
protected override void OnKeyDown(KeyEventArgs e) {
base.OnKeyDown(e);
if (e.KeyCode == Keys.Enter) {
UpdateText();
}
}
protected override void OnLeave(EventArgs e) {
base.OnLeave(e);
UpdateText();
}
[Browsable(false)]
public new ComboBoxStyle DropDownStyle {
get { return base.DropDownStyle; }
set { base.DropDownStyle = ComboBoxStyle.DropDown; }
}
}
}
================================================
FILE: DS_Map/LearnsetEditor.Designer.cs
================================================
namespace DSPRE {
partial class LearnsetEditor {
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent() {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LearnsetEditor));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.saveDataButton = new System.Windows.Forms.Button();
this.pokemonPictureBox = new System.Windows.Forms.PictureBox();
this.monNumberNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.movesListBox = new System.Windows.Forms.ListBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.descriptorLabel = new System.Windows.Forms.Label();
this.addMoveButton = new System.Windows.Forms.Button();
this.deleteMoveButton = new System.Windows.Forms.Button();
this.editMoveButton = new System.Windows.Forms.Button();
this.levelNumericUpDown = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.moveInputComboBox = new DSPRE.InputComboBox();
this.statusLabel = new System.Windows.Forms.Label();
this.pokemonNameInputComboBox = new DSPRE.InputComboBox();
this.entryCountLabel = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pokemonPictureBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.monNumberNumericUpDown)).BeginInit();
this.tableLayoutPanel2.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.tableLayoutPanel3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.levelNumericUpDown)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 4;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10.41322F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.49587F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 18.97891F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10.43285F));
this.tableLayoutPanel1.Controls.Add(this.saveDataButton, 3, 0);
this.tableLayoutPanel1.Controls.Add(this.pokemonPictureBox, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.monNumberNumericUpDown, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.pokemonNameInputComboBox, 1, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 5);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.58022F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 88.41978F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(491, 449);
this.tableLayoutPanel1.TabIndex = 0;
//
// saveDataButton
//
this.saveDataButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.saveDataButton.Image = ((System.Drawing.Image)(resources.GetObject("saveDataButton.Image")));
this.saveDataButton.Location = new System.Drawing.Point(441, 3);
this.saveDataButton.Name = "saveDataButton";
this.saveDataButton.Size = new System.Drawing.Size(47, 45);
this.saveDataButton.TabIndex = 30;
this.saveDataButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.saveDataButton.UseVisualStyleBackColor = true;
this.saveDataButton.Click += new System.EventHandler(this.saveDataButton_Click);
//
// pokemonPictureBox
//
this.pokemonPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.pokemonPictureBox.Location = new System.Drawing.Point(3, 3);
this.pokemonPictureBox.Name = "pokemonPictureBox";
this.pokemonPictureBox.Size = new System.Drawing.Size(44, 45);
this.pokemonPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.pokemonPictureBox.TabIndex = 12;
this.pokemonPictureBox.TabStop = false;
//
// monNumberNumericUpDown
//
this.monNumberNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.monNumberNumericUpDown.Location = new System.Drawing.Point(349, 15);
this.monNumberNumericUpDown.Name = "monNumberNumericUpDown";
this.monNumberNumericUpDown.Size = new System.Drawing.Size(86, 20);
this.monNumberNumericUpDown.TabIndex = 16;
this.monNumberNumericUpDown.ValueChanged += new System.EventHandler(this.monNumberNumericUpDown_ValueChanged);
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 2;
this.tableLayoutPanel1.SetColumnSpan(this.tableLayoutPanel2, 4);
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 8.303955F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 8.303955F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.Controls.Add(this.groupBox2, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.groupBox3, 1, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 54);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.Padding = new System.Windows.Forms.Padding(5);
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 382F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(485, 392);
this.tableLayoutPanel2.TabIndex = 17;
//
// groupBox2
//
this.groupBox2.Controls.Add(this.movesListBox);
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(8, 8);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(231, 376);
this.groupBox2.TabIndex = 34;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "View";
//
// movesListBox
//
this.movesListBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.movesListBox.FormattingEnabled = true;
this.movesListBox.Location = new System.Drawing.Point(3, 16);
this.movesListBox.Margin = new System.Windows.Forms.Padding(2);
this.movesListBox.Name = "movesListBox";
this.movesListBox.Size = new System.Drawing.Size(225, 357);
this.movesListBox.TabIndex = 0;
this.movesListBox.SelectedIndexChanged += new System.EventHandler(this.movesListBox_SelectedIndexChanged);
//
// groupBox3
//
this.groupBox3.Controls.Add(this.tableLayoutPanel3);
this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox3.Location = new System.Drawing.Point(245, 8);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(232, 376);
this.groupBox3.TabIndex = 35;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Edit";
//
// tableLayoutPanel3
//
this.tableLayoutPanel3.ColumnCount = 3;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel3.Controls.Add(this.entryCountLabel, 0, 5);
this.tableLayoutPanel3.Controls.Add(this.descriptorLabel, 0, 1);
this.tableLayoutPanel3.Controls.Add(this.addMoveButton, 0, 4);
this.tableLayoutPanel3.Controls.Add(this.deleteMoveButton, 2, 4);
this.tableLayoutPanel3.Controls.Add(this.editMoveButton, 1, 4);
this.tableLayoutPanel3.Controls.Add(this.levelNumericUpDown, 1, 2);
this.tableLayoutPanel3.Controls.Add(this.label1, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.moveInputComboBox, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.statusLabel, 0, 3);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 16);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.Padding = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.RowCount = 6;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 34.50088F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 65.49912F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 144F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(226, 357);
this.tableLayoutPanel3.TabIndex = 0;
//
// descriptorLabel
//
this.descriptorLabel.AutoSize = true;
this.tableLayoutPanel3.SetColumnSpan(this.descriptorLabel, 3);
this.descriptorLabel.Location = new System.Drawing.Point(5, 43);
this.descriptorLabel.Name = "descriptorLabel";
this.descriptorLabel.Padding = new System.Windows.Forms.Padding(1, 5, 1, 5);
this.descriptorLabel.Size = new System.Drawing.Size(57, 23);
this.descriptorLabel.TabIndex = 8;
this.descriptorLabel.Text = "Descriptor";
//
// addMoveButton
//
this.addMoveButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.addMoveButton.Enabled = false;
this.addMoveButton.Image = global::DSPRE.Properties.Resources.addIcon;
this.addMoveButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.addMoveButton.Location = new System.Drawing.Point(4, 286);
this.addMoveButton.Margin = new System.Windows.Forms.Padding(2);
this.addMoveButton.Name = "addMoveButton";
this.addMoveButton.Size = new System.Drawing.Size(70, 40);
this.addMoveButton.TabIndex = 1;
this.addMoveButton.Text = "Add";
this.addMoveButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.addMoveButton.UseVisualStyleBackColor = true;
this.addMoveButton.Click += new System.EventHandler(this.addMoveButton_Click);
//
// deleteMoveButton
//
this.deleteMoveButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.deleteMoveButton.Enabled = false;
this.deleteMoveButton.Image = global::DSPRE.Properties.Resources.deleteIcon;
this.deleteMoveButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.deleteMoveButton.Location = new System.Drawing.Point(152, 286);
this.deleteMoveButton.Margin = new System.Windows.Forms.Padding(2);
this.deleteMoveButton.Name = "deleteMoveButton";
this.deleteMoveButton.Size = new System.Drawing.Size(70, 40);
this.deleteMoveButton.TabIndex = 2;
this.deleteMoveButton.Text = "Delete";
this.deleteMoveButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.deleteMoveButton.UseVisualStyleBackColor = true;
this.deleteMoveButton.Click += new System.EventHandler(this.deleteMoveButton_Click);
//
// editMoveButton
//
this.editMoveButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.editMoveButton.Enabled = false;
this.editMoveButton.Image = global::DSPRE.Properties.Resources.RenameIcon;
this.editMoveButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.editMoveButton.Location = new System.Drawing.Point(78, 286);
this.editMoveButton.Margin = new System.Windows.Forms.Padding(2);
this.editMoveButton.Name = "editMoveButton";
this.editMoveButton.Size = new System.Drawing.Size(70, 40);
this.editMoveButton.TabIndex = 3;
this.editMoveButton.Text = "Edit";
this.editMoveButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.editMoveButton.UseVisualStyleBackColor = true;
this.editMoveButton.Click += new System.EventHandler(this.editMoveButton_Click);
//
// levelNumericUpDown
//
this.tableLayoutPanel3.SetColumnSpan(this.levelNumericUpDown, 2);
this.levelNumericUpDown.Dock = System.Windows.Forms.DockStyle.Fill;
this.levelNumericUpDown.Location = new System.Drawing.Point(78, 122);
this.levelNumericUpDown.Margin = new System.Windows.Forms.Padding(2);
this.levelNumericUpDown.Name = "levelNumericUpDown";
this.levelNumericUpDown.Size = new System.Drawing.Size(144, 20);
this.levelNumericUpDown.TabIndex = 4;
this.levelNumericUpDown.ValueChanged += new System.EventHandler(this.levelNumericUpDown_ValueChanged);
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(4, 123);
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(70, 13);
this.label1.TabIndex = 5;
this.label1.Text = "Level:";
//
// moveInputComboBox
//
this.moveInputComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.moveInputComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.moveInputComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.tableLayoutPanel3.SetColumnSpan(this.moveInputComboBox, 3);
this.moveInputComboBox.FormattingEnabled = true;
this.moveInputComboBox.Location = new System.Drawing.Point(4, 12);
this.moveInputComboBox.Margin = new System.Windows.Forms.Padding(2);
this.moveInputComboBox.Name = "moveInputComboBox";
this.moveInputComboBox.Size = new System.Drawing.Size(218, 21);
this.moveInputComboBox.TabIndex = 6;
this.moveInputComboBox.SelectedIndexChanged += new System.EventHandler(this.moveInputComboBox_SelectedIndexChanged);
//
// statusLabel
//
this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.statusLabel.AutoSize = true;
this.tableLayoutPanel3.SetColumnSpan(this.statusLabel, 3);
this.statusLabel.Location = new System.Drawing.Point(5, 261);
this.statusLabel.Name = "statusLabel";
this.statusLabel.Padding = new System.Windows.Forms.Padding(1, 5, 1, 5);
this.statusLabel.Size = new System.Drawing.Size(39, 23);
this.statusLabel.TabIndex = 7;
this.statusLabel.Text = "Status";
//
// pokemonNameInputComboBox
//
this.pokemonNameInputComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.pokemonNameInputComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.pokemonNameInputComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.pokemonNameInputComboBox.FormattingEnabled = true;
this.pokemonNameInputComboBox.Location = new System.Drawing.Point(53, 15);
this.pokemonNameInputComboBox.Name = "pokemonNameInputComboBox";
this.pokemonNameInputComboBox.Size = new System.Drawing.Size(290, 21);
this.pokemonNameInputComboBox.TabIndex = 31;
this.pokemonNameInputComboBox.SelectedIndexChanged += new System.EventHandler(this.pokemonNameInputComboBox_SelectedIndexChanged);
//
// entryCountLabel
//
this.entryCountLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.entryCountLabel.AutoSize = true;
this.tableLayoutPanel3.SetColumnSpan(this.entryCountLabel, 3);
this.entryCountLabel.Location = new System.Drawing.Point(5, 332);
this.entryCountLabel.Name = "entryCountLabel";
this.entryCountLabel.Padding = new System.Windows.Forms.Padding(1, 5, 1, 5);
this.entryCountLabel.Size = new System.Drawing.Size(70, 23);
this.entryCountLabel.TabIndex = 9;
this.entryCountLabel.Text = "Entry Count: ";
this.entryCountLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// LearnsetEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(501, 459);
this.Controls.Add(this.tableLayoutPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LearnsetEditor";
this.Padding = new System.Windows.Forms.Padding(5);
this.Text = "Learnset Editor";
this.tableLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pokemonPictureBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.monNumberNumericUpDown)).EndInit();
this.tableLayoutPanel2.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox3.ResumeLayout(false);
this.tableLayoutPanel3.ResumeLayout(false);
this.tableLayoutPanel3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.levelNumericUpDown)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.PictureBox pokemonPictureBox;
private System.Windows.Forms.Button saveDataButton;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.ListBox movesListBox;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.Button addMoveButton;
private System.Windows.Forms.Button deleteMoveButton;
private System.Windows.Forms.Button editMoveButton;
private System.Windows.Forms.NumericUpDown levelNumericUpDown;
private System.Windows.Forms.Label label1;
private InputComboBox moveInputComboBox;
private System.Windows.Forms.Label descriptorLabel;
private System.Windows.Forms.Label statusLabel;
public InputComboBox pokemonNameInputComboBox;
public System.Windows.Forms.NumericUpDown monNumberNumericUpDown;
private System.Windows.Forms.Label entryCountLabel;
}
}
================================================
FILE: DS_Map/LearnsetEditor.cs
================================================
using DSPRE.Resources;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MessageBox = System.Windows.Forms.MessageBox;
namespace DSPRE {
public partial class LearnsetEditor : Form {
private readonly string[] fileNames;
private readonly string[] pokenames;
private readonly string[] moveNames;
private PokemonEditor _parent;
private readonly string[] editButtonNames = new string[] {
"Edit",
"Confirm"
};
private readonly string[] deleteButtonNames = new string[] {
"Delete",
"Discard"
};
private bool editMode = false;
private int currentLoadedId = 0;
private LearnsetData currentLoadedFile = null;
private bool dirty = false;
private readonly string formName = "Learnset Editor";
public LearnsetEditor(string[] moveNames, Control parent, PokemonEditor pokeEditor) {
this.moveNames = moveNames;
this._parent = pokeEditor;
InitializeComponent();
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Size = parent.Size;
this.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom;
Helpers.DisableHandlers();
BindingList listMoveNames = new BindingList(moveNames);
moveInputComboBox.DataSource = listMoveNames;
/* ---------------- */
int count = RomInfo.GetLearnsetFilesCount();
this.pokenames = RomInfo.GetPokemonNames();
List fileNames = new List(count);
fileNames.AddRange(pokenames);
for (int i = 0; i < PokeDatabase.PersonalData.personalExtraFiles.Length; i++) {
PokeDatabase.PersonalData.PersonalExtraFiles altFormEntry = PokeDatabase.PersonalData.personalExtraFiles[i];
fileNames.Add(fileNames[altFormEntry.monId] + " - " + altFormEntry.description);
}
int extraEntries = fileNames.Count;
for (int i = 0; i < count - extraEntries; i++) {
fileNames.Add($"Extra entry {fileNames.Count}");
}
this.fileNames = fileNames.ToArray();
monNumberNumericUpDown.Maximum = fileNames.Count - 1;
pokemonNameInputComboBox.Items.AddRange(this.fileNames);
/* ---------------- */
descriptorLabel.Text = "";
statusLabel.Text = "";
Helpers.EnableHandlers();
pokemonNameInputComboBox.SelectedIndex = 1;
}
private void setDirty(bool status) {
if (status) {
dirty = true;
this.Text = formName + "*";
} else {
dirty = false;
this.Text = formName;
}
}
public bool CheckDiscardChanges() {
if (!dirty) {
return true;
}
DialogResult res = MessageBox.Show(this, "Learnsets Editor\nThere are unsaved changes to the current Learnset data.\nDiscard and proceed?", "Learnset Editor - Unsaved changes", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (res.Equals(DialogResult.Yes)) {
return true;
}
monNumberNumericUpDown.Value = currentLoadedId;
pokemonNameInputComboBox.SelectedIndex = currentLoadedId;
return false;
}
private string ElemToString((ushort level, ushort move) elem) {
return $"Lv. {elem.level}: {moveNames[elem.move]}";
}
public void ChangeLoadedFile(int toLoad) {
currentLoadedId = toLoad;
currentLoadedFile = new LearnsetData(currentLoadedId);
PopulateAllFromCurrentFile();
UpdateButtonsOnMoveSelection();
int excess = toLoad - pokenames.Length;
try {
if (excess >= 0) {
toLoad = PokeDatabase.PersonalData.personalExtraFiles[excess].iconId;
}
} catch (IndexOutOfRangeException) {
toLoad = 0;
} finally {
pokemonPictureBox.Image = DSUtils.GetPokePic(toLoad, pokemonPictureBox.Width, pokemonPictureBox.Height);
}
setDirty(false);
}
private void PopulateAllFromCurrentFile() {
movesListBox.BeginUpdate();
movesListBox.Items.Clear();
foreach (var elem in currentLoadedFile.list) {
movesListBox.Items.Add(ElemToString(elem));
}
UpdateEntryCountLabel();
movesListBox.EndUpdate();
}
//-------------------------------
private void saveDataButton_Click(object sender, EventArgs e) {
currentLoadedFile.SaveToFileDefaultDir(currentLoadedId, true);
setDirty(false);
}
private void pokemonNameInputComboBox_SelectedIndexChanged(object sender, EventArgs e) {
Update();
if (Helpers.HandlersDisabled) {
return;
}
this._parent.TrySyncIndices((ComboBox)sender);
Helpers.DisableHandlers();
if (CheckDiscardChanges()) {
int newNumber = pokemonNameInputComboBox.SelectedIndex;
monNumberNumericUpDown.Value = newNumber;
ChangeLoadedFile(newNumber);
}
Helpers.EnableHandlers();
}
private void monNumberNumericUpDown_ValueChanged(object sender, EventArgs e) {
Update();
if (Helpers.HandlersDisabled) {
return;
}
this._parent.TrySyncIndices((NumericUpDown)sender);
Helpers.DisableHandlers();
if (CheckDiscardChanges()) {
int newNumber = (int)monNumberNumericUpDown.Value;
pokemonNameInputComboBox.SelectedIndex = newNumber;
ChangeLoadedFile(newNumber);
}
Helpers.EnableHandlers();
}
private void moveInputComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (currentLoadedFile == null) {
return;
}
UpdateAddEditStatus();
descriptorLabel.Text = "Move ID: " + moveInputComboBox.SelectedIndex;
}
private bool CheckValidEntry() {
return levelNumericUpDown.Value > 0 &&
moveInputComboBox.SelectedIndex > 0;
}
private void levelNumericUpDown_ValueChanged(object sender, EventArgs e) {
if (currentLoadedFile == null) {
return;
}
UpdateAddEditStatus();
}
private void UpdateAddEditStatus() {
(byte level, ushort move) newEntry = ((byte)levelNumericUpDown.Value, (ushort)moveInputComboBox.SelectedIndex);
bool duplicate = currentLoadedFile.list.Contains(newEntry);
if (duplicate) {
if (editMode) {
editMoveButton.Enabled = false;
} else {
addMoveButton.Enabled = false;
}
statusLabel.Text = "Entry already exists!";
} else {
bool addable = CheckValidEntry();
if (addable) {
statusLabel.Text = "";
} else {
statusLabel.Text = "Invalid Move ID or Level!";
}
if (editMode) {
editMoveButton.Enabled = addable;
} else {
addMoveButton.Enabled = addable;
}
}
}
private void addMoveButton_Click(object sender, EventArgs e) {
(byte level, ushort move) newEntry = ((byte)levelNumericUpDown.Value, (ushort)moveInputComboBox.SelectedIndex);
currentLoadedFile.list.Add(newEntry);
currentLoadedFile.list.Sort();
PopulateAllFromCurrentFile();
movesListBox.SelectedIndex = currentLoadedFile.list.FindIndex(x => x == newEntry);
UpdateAddEditStatus();
setDirty(true);
}
private void deleteMoveButton_Click(object sender, EventArgs e) {
int sel = movesListBox.SelectedIndex;
if (sel < 0) {
return;
}
if (editMode) {
editMode = false;
movesListBox.Enabled = true;
UpdateButtonsOnMoveSelection();
} else {
currentLoadedFile.list.RemoveAt(sel);
movesListBox.Items.RemoveAt(sel);
int count = movesListBox.Items.Count;
if (count > 0) {
movesListBox.SelectedIndex = Math.Max(0, sel - 1);
}
UpdateEntryCountLabel();
}
UpdateByEditMode();
setDirty(true);
}
private void editMoveButton_Click(object sender, EventArgs e) {
int sel = movesListBox.SelectedIndex;
if (sel < 0) {
return;
}
if (editMode) {
(byte level, ushort move) newEntry = ((byte)levelNumericUpDown.Value, (ushort)moveInputComboBox.SelectedIndex);
int newSelection;
int oldLevel = currentLoadedFile.list[sel].level;
currentLoadedFile.list[sel] = newEntry;
if (newEntry.level == oldLevel) {
movesListBox.Items[sel] = ElemToString(newEntry);
newSelection = sel;
} else {
currentLoadedFile.list.Sort();
PopulateAllFromCurrentFile();
newSelection = currentLoadedFile.list.FindIndex(x => x == newEntry);
}
UpdateEntryCountLabel();
movesListBox.SelectedIndex = newSelection;
editMode = false;
movesListBox.Enabled = true;
} else {
editMode = true;
movesListBox.Enabled = false;
editMoveButton.Text = editButtonNames[1];
deleteMoveButton.Text = deleteButtonNames[1];
(ushort level, ushort move) = currentLoadedFile.list[sel];
moveInputComboBox.SelectedIndex = move;
levelNumericUpDown.Value = level;
}
UpdateByEditMode();
addMoveButton.Enabled = (editMode == false && CheckValidEntry());
setDirty(true);
}
private void UpdateByEditMode() {
UpdateButtonNames(editMode);
}
private void UpdateButtonNames(bool editMode) {
int index = editMode == false ? 0 : 1;
editMoveButton.Text = editButtonNames[index];
deleteMoveButton.Text = deleteButtonNames[index];
}
private void movesListBox_SelectedIndexChanged(object sender, EventArgs e) {
UpdateButtonsOnMoveSelection();
}
private void UpdateButtonsOnMoveSelection() {
int sel = movesListBox.SelectedIndex;
if (sel < 0) {
editMoveButton.Enabled = false;
deleteMoveButton.Enabled = false;
return;
}
editMoveButton.Enabled = true;
deleteMoveButton.Enabled = true;
}
private void UpdateEntryCountLabel(){
StringBuilder labelText = new StringBuilder("Entry Count: ");
labelText.Append(movesListBox.Items.Count);
if (movesListBox.Items.Count > LearnsetData.VanillaLimit) {
labelText.Append("!");
entryCountLabel.ForeColor = Color.FromArgb(210, 120, 0);
entryCountLabel.Font = new Font(entryCountLabel.Font, FontStyle.Bold);
} else {
entryCountLabel.ForeColor = Color.Black;
entryCountLabel.Font = new Font(entryCountLabel.Font, FontStyle.Regular);
}
entryCountLabel.Text = labelText.ToString();
}
}
}
================================================
FILE: DS_Map/LearnsetEditor.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAacSURBVFhHxZd5bFRVGMX5Aw24VmtbI4lGoyHGYPSP
mqgoEQg0SqELbVEiGiWAqIS1lha6sdTK0oWyiAYQTBVQBEqrgEaIghAKDaC1te1M91k7nZnXmS4z0+N3
7rQDtTMmNia85Mx777v3/s5533uzjQJwS+V/8W+3ReVUmMOzK3B/VjnCMstx19py3LGmHGNHKK4lgywy
yY7MKjsqXqP9lrINBKC5Jfu8A1VWH65YfDhv9MrQ/7ORRSbZ9Ihce7RMPP0hZJy7MKarsfkwOr8WYzfX
YdTGGlitHdC1W1DfNjJxLRlkkUk2PeglnnfTeDBAJFt01epFWKEOY+IyMHarDna7DY0mCWEUmWz+vahB
yRo4D1bjeaPJqhhkkUk2PeglnhE0vilABSpNHkSVNOKe2Zm4t6gRmtOBVqsDbZ1utDu60Wp3o8XmQnNH
l0hDa6dLFKzGcw0tFjucDodikUk2PehFTxrfCCBtOdfWi3Hb9Xhw+UGEF+uhaU4Y7C6kzE7E6ynJ2Lm9
BNu3FWNbUQEMjh4kJcZjR8m2ILViFBcWoM2myUU4FYtMsulBL3rSOBCA9+VMcy8e2dGAJz7VI6q4Hq6u
LhXA1NUHs9ur9gatVxmxI0Y5NmpSc/prBqmZ5Jx1jrfbuhSDLDLJpsfAMzA8wOnGHjy+swFP7tZhXIkE
cLlhFJDZ5YW1G7L3SQgvjF2eG3L6A3COxd0fmKNCye0hgywyyaZH0AAPSPFEQ4+aOOFznUrb090Nq6sP
ydLWOclJ/nYXF6EkoEIUF2yVcP0yJyEwh/Wigi0waz3oFgZZZJJND3rRk8ZDAhyrd8tEPZ7Zo8dju3To
6emFRdre0QPY+qD2NGM3/OqHRa6YV//POayZpQtkkEUm2fQIGeBwrRvP7tUjep8e43c3oK/Pgw65950C
pgjvEGO7HDvkc2qwRkMes869rXcgoMujGGSRSTY9ggfIqUBptQvPfdGE5/c34ilpmcfjhV1giXEzA211
eICkhHikJCXK01+kanapJcbPGrg9heodUbhlM2zdPsUgi0yy6UEvetI4ECBCivv/cOHFA8146csm1TKv
V65s4OoGr8wmV8wQTukAjVljF1QH5DwwV2o2eSg9nn7FIpNsetCLnjQeEmDv7xomlbZgsiha0nKT24hO
GlDSVpsocB6qNlB3yp4bWWSSTY+QAT67qmHqVy2Y/rVMlsSndG4F8PWPTNzIIItMsukRMsAuGYw52IrX
DrXi1YMtmFLajJdl8cQDIxPXkkEWmWTTI2SA7VUaYg+3Ie7bNsSLZn3ThplyPuNw64jEtWSQRSbZ9AgZ
oPiKhoQj7Zj9XTuSRDyOFUDMoTZMk/T/RVzDtWSQRSaP6RE0QKQUCyo1JB81YM4xv+KPGFBaaQC88lj3
iTzymHvl8ad4zFooyRquJWOQRzY96EVPGg8JsPWShrnHDXizzKD2cZIYXg+u1ptwVdeB6hYNfxm7lapb
nKpWVW8WmYaqTubLHj6PYtzMpEfIAJsuOTGv3Ii3RPNOGJEgbePVXtfZYJKPvozsPEybOhnTpryC9Mx1
qnZd34lrMn5df0M8vybhuJYMshRTRI+QAT655MC735swX/ROhQnJ0jZCqpsd4Fs6ZnoMlqXlinKwcEka
5INOjVU324erqVOtJYMsMsmmR8gAH1/UsPCkBYtOmrHgBzPeKDNKG72oadUgdxyxM2Kxam0eVq7ZgPeX
r0WvvNc5VtPqHK4Wh6z1KQZZZJJNj5ABNl504IPTZqXFp8yqZej3oU7uOX8jx8XFIy07Hx9l5mPJqmzI
o6bG6gyuoOJaMsga5NIjZIANMrj0J6vIgiU/WlTLhAKduVde5QsncTYy1m1Ges4mLF+dq0JxTGfqHi4J
xrVkkEUm2fT4lwAaUs/akHqmAyt+tmLRKYsMQ350elSApOQUrFm/BWskxMqM9ZBHAM0y1tTRN1TWPjRb
5UtENjLIIpNsegQNEJVV1pl/2Y11FzTk/uaUPxBOrDhrVxCTpnZISExEWmYeVmflITU9V9WMTshvweEy
ibiRQRaZZNMjYuWBs+I55Gd5mCg6KvO4nemo8Oxy3J5ehmvXanHu8p/45XIN3p6/4L2lq1IXf7hs2eK5
G/fsuFBVi18rZSyIzom4lgyyBrkRy/edE6+nRUP+mNwmekgULZosmhJEL4jGix4WPSqaIJooCjY3lCaJ
aM6rH/LXjBtDsBO8N8F0n2iMiAs5905RuCjY3FCiMa982J/TW7SNGvU3iJOEw8UaLRYAAAAASUVORK5C
YII=
AAABAAEAlpYAAAEAIABwawEAFgAAACgAAACWAAAALAEAAAEAIAAAAAAAkF8BAMMOAADDDgAAAAAAAAAA
AAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgGAICYEQCAmCYAgJhKAICYewCAmLEAgJjhAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmOEAgJixAICYewCAmEoAgJgmAICYEQCA
mAYAgJgwAICYOQCAmEoAgJhpAICYkgCAmL4AgJjmAICY/ACAmP8AgJj/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wCAmP8AgJj/AICY/ACAmOYAgJi+AICYkgCAmGkAgJhKAICYOQCA
mDAAgJhoAICYbwCAmHsAgJiSAICYrwCAmNAAgJjtAICY/QB/l/8Af5f/AH+X/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+X/wB/l/8Af5f/AICY/QCAmO0AgJjQAICYrwCAmJIAgJh7AICYbwCA
mGgAgJimAICYqgCAmLEAgJi+AICY0ACAmOMAgJj0AICY/gB/l/8Af5f/AH+W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+W/wB/l/8Af5f/AICY/gCAmPQAgJjjAICY0ACAmL4AgJixAICYqgCA
mKYAgJjcAICY3gCAmOEAgJjmAICY7QCAmPQAgJj7AICY/wCAmP8AgJj/AICY/wCAmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCAmf8AgJn/AICZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AICZ/wCAmf8AgJn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgJn/AICY/wCAmP8AgJj/AICY/wCAmPsAgJj0AICY7QCAmOYAgJjhAICY3gCA
mNwAgJj7AICY/ACAmPwAgJj8AICY/QCAmP4AgJj/AIGZ/wCCmv8Ag5z/AIWe/wCGn/8Ah5//AIeg/wCH
oP8Ah6D/AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
n/8Ah5//AIef/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCH
oP8Bh6D/A4ig/wSIof8FiaH/Bomh/weJof8HiaH/B4mh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/B4mh/weJof8HiaH/Bomh/wWJof8EiKH/A4ig/wGH
oP8Ah6D/AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIef/wCH
n/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
oP8Ah6D/AIeg/wCHn/8Ahp//AIWe/wCDnP8Agpr/AIGZ/wCAmP8AgJj+AICY/QCAmPwAgJj8AICY/ACA
mPsAgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIKa/wCFnv8AiaL/AI2n/wCQqv8Akaz/AJKs/wCR
rP8Akaz/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wGR
q/8Dkqz/B5St/wuVrv8Ol6//EJiw/xGYsP8RmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xGYsP8RmLD/EJiw/w6Xr/8Lla7/B5St/wOS
rP8Bkav/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
rP8Akaz/AJKs/wCRrP8AkKr/AI2n/wCJov8AhZ7/AIKa/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIOc/wCJov8AkKr/AJax/wCbt/8Anrr/AJ+7/wCe
u/8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrr/AJ26/wCduv8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCcuf8AnLn/AJ25/wKd
uv8GoLv/DKK9/xOlv/8ZqMH/HarC/x6qwv8eqsL/HarC/xyqwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8cqsL/HarC/x6qwv8eqsL/HarC/xmowf8Tpb//DKK9/wag
u/8Cnbr/AJ25/wCcuf8AnLn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbr/AJ26/wCe
uv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrv/AJ+7/wCeuv8Am7f/AJax/wCQqv8AiaL/AIOc/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH+W/wB/lv8AgJj/AIWe/wCNp/8AlrH/AJ+8/wCnxP8Aqsj/AKvK/wCr
yf8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKnI/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnH/wCpx/8Aqcf/AKnH/wKq
yP8Ircr/EbHN/xu10P8judL/KbvU/yu81P8rvNT/KrzU/ym71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8pu9T/KrzU/yu81P8rvNT/KbvU/yO50v8btdD/EbHN/wit
yv8Cqsj/AKnH/wCpx/8Aqcf/AKnH/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aq8n/AKvK/wCqyP8Ap8T/AJ+8/wCWsf8Ajaf/AIWe/wCAmP8Af5b/AH+W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQqv8Am7f/AKfE/wCvzv8AtNP/ALXV/wC1
1P8AtNP/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz
0/8As9P/ALTT/wG00/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8As9P/AbTT/wS1
1P8Mudb/Fr3Z/yLC3P8sxt//Msnh/zXK4v82y+L/Nsri/zXK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v81yuL/Nsri/zbL4v81yuL/Msnh/yzG3/8iwtz/Fr3Z/wy5
1v8EtdT/AbTT/wCz0/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8BtNP/ALTT/wCz
0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wC0
0/8AtdT/ALXV/wC00/8Ar87/AKfE/wCbt/8AkKr/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALrb/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC4
2P8BuNj/ArnZ/wS62f8Gu9r/CLzb/wm82/8Kvdv/Cr3b/wq82/8JvNv/Cbzb/wi82/8HvNv/CLzb/wu9
3P8SwN7/HMTh/yfJ5P8wzeb/ONDo/zzS6f8/0+r/QdTq/0LU6v9D1er/Q9Xq/0PV6v9D1er/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PV6v9D1er/Q9Xq/0PV6v9C1Or/QdTq/z/T6v880un/ONDo/zDN5v8nyeT/HMTh/xLA
3v8Lvdz/CLzb/we82/8IvNv/Cbzb/wm82/8KvNv/Cr3b/wq92/8JvNv/CLzb/wa72v8Eutn/ArnZ/wG4
2P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALrb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCSrP8An7v/AKvK/wC11f8Autv/ALzd/wC8
3P8Au9v/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALna/wC5
2v8Butr/BLvb/wm93f8OwN7/EsHf/xTD4P8Vw+D/FsPg/xXD4P8Vw+D/FMPg/xPC4P8SwuD/E8Lg/xXD
4f8axeL/Isnk/yrM5/8y0On/OdPr/0DV7P9G1+3/S9nt/0/b7f9R3O7/Utzu/1Lc7v9R3O7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Hc7v9S3O7/Utzu/1Hc7v9P2+3/S9nt/0bX7f9A1ez/OdPr/zLQ6f8qzOf/Isnk/xrF
4v8Vw+H/E8Lg/xLC4P8TwuD/FMPg/xXD4P8Vw+D/FsPg/xXD4P8Uw+D/EsHf/w7A3v8Jvd3/BLvb/wG6
2v8Audr/ALna/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC7
2/8AvNz/ALzd/wC62/8AtdX/AKvK/wCfu/8Akqz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrv/AKvJ/wC11P8Autr/ALzc/wC7
3P8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC52v8Audn/ALnZ/wC5
2f8Cutr/B7zb/w6/3v8Ww+D/Hcbi/yHI4/8jyOT/I8nk/yLI5P8iyOP/Icjj/yDH4/8fx+P/H8fj/yHI
5P8kyeT/KMvm/y3N5/8z0On/OtPq/0PW7P9M2e3/Vd3u/1zf7/9g4e//YeHv/2Dh7/9f4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/1/g7/9g4e//YeHv/2Dh7/9c3+//Vd3u/0zZ7f9D1uz/OtPq/zPQ6f8tzef/KMvm/yTJ
5P8hyOT/H8fj/x/H4/8gx+P/Icjj/yLI4/8iyOT/I8nk/yPI5P8hyOP/Hcbi/xbD4P8Ov97/B7zb/wK6
2v8Audn/ALnZ/wC52f8Audr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC6
2v8Au9z/ALzc/wC62v8AtdT/AKvJ/wCeu/8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALvb/wC6
2v8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC42f8AuNj/ALjY/wC4
2P8Dudn/Crzb/xPB3v8exeH/J8nk/yzM5f8vzeb/L83m/y7M5v8tzOb/Lczm/y3M5f8szOX/Lczl/y3M
5v8uzOb/MM3n/zLO5/820Oj/PNLp/0bW6v9S2uz/Xd/t/2fi7/9s5O//buXv/27l7/9t5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/23k7/9u5e//buXv/2zk7/9n4u//Xd/t/1La7P9G1ur/PNLp/zbQ6P8yzuf/MM3n/y7M
5v8tzOb/Lczl/yzM5f8tzOX/Lczm/y3M5v8uzOb/L83m/y/N5v8szOX/J8nk/x7F4f8Twd7/Crzb/wO5
2f8AuNj/ALjY/wC42P8AuNn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC5
2f8Autr/ALvb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK5
2f8Gu9r/Dr7c/xnD3/8kyOL/Lszl/zTO5/83z+j/N9Do/zbP6P82z+f/Ns/n/zfP5/840Oj/OdDo/zrQ
6P860Oj/OdDo/znQ6P880ej/QdPp/0vX6v9Y3Oz/ZeHu/2/l7/915/D/eOjw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eOjw/3Xn8P9v5e//ZeHu/1jc7P9L1+r/QdPp/zzR6P850Oj/OdDo/zrQ
6P860Oj/OdDo/zjQ6P83z+f/Ns/n/zbP5/82z+j/N9Do/zfP6P80zuf/Lszl/yTI4v8Zw9//Dr7c/wa7
2v8Cudn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK42P8Dudn/Brra/wm8
2/8Pvtz/FsLe/yDG4f8qyuT/Ms3m/zfQ6P850en/OdHp/znQ6P850Oj/O9Hp/z7S6f9B0+n/RNXq/0fW
6v9H1ur/RtXq/0XV6v9G1er/Stfq/1Pa6/9e3u3/aePu/3Pm7/966fD/f+vx/4Ps8v+F7fP/h+3z/4ju
9P+J7vT/iO/0/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv
9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/0/4nu
9P+I7vT/h+3z/4Xt8/+D7PL/f+vx/3rp8P9z5u//aePu/17e7f9T2uv/Stfq/0bV6v9F1er/RtXq/0fW
6v9H1ur/RNXq/0HT6f8+0un/O9Hp/znQ6P850Oj/OdHp/znR6f830Oj/Ms3m/yrK5P8gxuH/FsLe/w++
3P8JvNv/Brra/wO52f8CuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC31/8At9f/AbjY/wS52f8Iu9r/Db3c/xPA
3f8Zw9//IMbh/yfJ4/8uzOX/NM7n/zfQ6P840On/ONDp/zjQ6P850Oj/PNLp/0PU6v9J1+v/UNnr/1Tb
7P9W2+z/Vdvs/1Pa7P9T2uv/Vtvs/1ze7P9k4e3/bOTu/3Xn8P996vH/hO3y/4zv9P+S8fX/l/P3/5n0
+P+Z9fn/mfb5/5j2+v+X9vv/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3
+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f2+/+Y9vr/mfb5/5n1
+f+Z9Pj/l/P3/5Lx9f+M7/T/hO3y/33q8f915/D/bOTu/2Th7f9c3uz/Vtvs/1Pa6/9T2uz/Vdvs/1bb
7P9U2+z/UNnr/0nX6/9D1Or/PNLp/znQ6P840Oj/ONDp/zjQ6f830Oj/NM7n/y7M5f8nyeP/IMbh/xnD
3/8TwN3/Db3c/wi72v8Eudn/AbjY/wC31/8At9f/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALfY/wC31/8At9f/AbjY/wa62f8Nvdv/FcHe/x7F
4P8lyOL/Ksrk/y7M5f8yzuf/Nc/n/zfQ6P830Oj/Ns/o/zbP6P840Oj/PtLp/0fW6v9R2ev/W93t/2Hg
7f9k4e7/ZOHu/2Pg7f9i4O3/Y+Dt/2bh7v9q4+7/cOXv/3bn8P9+6vH/h+3z/5Lx9f+b9Pf/ovb4/6X4
+v+m+fv/pfr8/6T6/P+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6
/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+k+vz/pfr8/6b5
+/+l+Pr/ovb4/5v09/+S8fX/h+3z/37q8f925/D/cOXv/2rj7v9m4e7/Y+Dt/2Lg7f9j4O3/ZOHu/2Th
7v9h4O3/W93t/1HZ6/9H1ur/PtLp/zjQ6P82z+j/Ns/o/zfQ6P830Oj/Nc/n/zLO5/8uzOX/Ksrk/yXI
4v8exeD/FcHe/w292/8Gutn/AbjY/wC31/8At9f/ALfY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC32P8AuNj/ArnY/wi72v8Rv93/HMTg/yfJ
4/8uzOX/M87n/zbP5/830Oj/ONDo/zjQ6P840Oj/N9Do/zfQ6P860ej/QdPp/0vX6v9Y3Oz/ZODu/2zk
7/9w5e//ceXv/3Hl7/9w5e//cOXv/3Hl7/9y5u//defw/3jo8P9/6vH/iO3y/5Pw9P+d8vX/pfT2/6j1
9v+q9vb/qfX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j1
9v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qfX2/6r2
9v+o9fb/pfT2/53y9f+T8PT/iO3y/3/q8f946PD/defw/3Lm7/9x5e//cOXv/3Dl7/9x5e//ceXv/3Dl
7/9s5O//ZODu/1jc7P9L1+r/QdPp/zrR6P830Oj/N9Do/zjQ6P840Oj/ONDo/zfQ6P82z+f/M87n/y7M
5f8nyeP/HMTg/xG/3f8Iu9r/ArnY/wC42P8At9j/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8BuNj/AbjY/wG52P8Dudn/B7va/w6+3P8Xwt//I8fi/y3L
5f81z+f/OdHo/zzS6f890un/PtLp/z/S6f8+0un/PdLp/z3S6f9A0+n/R9bq/1La6/9f3u3/a+Pu/3Tm
7/956PD/e+nx/3zp8f996fH/ferx/33q8f996vH/ferx/3/q8f+C6vH/iOvx/4/r8P+V6+//muvt/53p
6/+f5+j/oOXl/6Hj4/+h4uH/oeHg/6Hh4P+h4eD/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh
4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4P+h4eD/oeHg/6Hi4f+h4+P/oOXl/5/n
6P+d6ev/muvt/5Xr7/+P6/D/iOvx/4Lq8f9/6vH/ferx/33q8f996vH/ferx/33p8f986fH/e+nx/3no
8P905u//a+Pu/1/e7f9S2uv/R9bq/0DT6f890un/PdLp/z7S6f8/0un/PtLp/z3S6f880un/OdHo/zXP
5/8ty+X/I8fi/xfC3/8Ovtz/B7va/wO52f8Budj/AbjY/wG42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALfY/wC42P8CuNj/BLnZ/we72v8Lvdv/EL/d/xbC3v8fxeH/KMnk/zDN
5v830Oj/PdLp/0LU6v9F1er/SNbq/0rX6v9K1+r/Sdbq/0nW6v9L1+r/UNnr/1nd7P9k4e3/buTv/3fo
8P9+6vH/g+zy/4fu8/+L7/T/jfD1/47x9v+N8fb/jPH3/4vw9v+J7fP/hunw/4Pk6/+A3uX/f9jf/4DS
1/+DzM//h8bH/4rBwP+Mvbv/jby5/427uP+NvLn/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428
uv+NvLr/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428uf+Nu7j/jby5/4y9u/+KwcD/h8bH/4PM
z/+A0tf/f9jf/4De5f+D5Ov/hunw/4nt8/+L8Pb/jPH3/43x9v+O8fb/jfD1/4vv9P+H7vP/g+zy/37q
8f936PD/buTv/2Th7f9Z3ez/UNnr/0vX6v9J1ur/Sdbq/0rX6v9K1+r/SNbq/0XV6v9C1Or/PdLp/zfQ
6P8wzeb/KMnk/x/F4f8Wwt7/EL/d/wu92/8Hu9r/BLnZ/wK42P8AuNj/ALfY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8At9f/ALfX/wC32P8Dudj/CLva/w6+3P8Uwd7/G8Pg/yHG4f8nyeP/LMvl/zLO
5/840Oj/P9Pp/0fW6v9O2Ov/VNvs/1jc7P9Z3Oz/WNzs/1fc7P9Y3Oz/XN7s/2Hg7f9p4u7/cOXv/3jo
8P+A6/L/ie7z/5Hx9f+Y8/f/nPX4/573+v+f+fz/nfn8/5n2+v+Q8PX/gubt/3PZ4/9kzNj/W8DL/1q0
vv9eqa//ZJ6g/2uVlP9vj4v/cYyI/3GMh/9xjYj/cI2J/3COif9wjon/cI6J/3COif9wjon/cI6J/3CO
if9wjon/cI6J/3COif9wjon/cI6J/3COif9wjon/cI2J/3GNiP9xjIf/cYyI/2+Pi/9rlZT/ZJ6g/16p
r/9atL7/W8DL/2TM2P9z2eP/gubt/5Dw9f+Z9vr/nfn8/5/5/P+e9/r/nPX4/5jz9/+R8fX/ie7z/4Dr
8v946PD/cOXv/2ni7v9h4O3/XN7s/1jc7P9X3Oz/WNzs/1nc7P9Y3Oz/VNvs/07Y6/9H1ur/P9Pp/zjQ
6P8yzuf/LMvl/yfJ4/8hxuH/G8Pg/xTB3v8Ovtz/CLva/wO52P8At9j/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8At9f/ALfX/wC42P8Eudn/DL3b/xXB3v8exeD/Jsjj/yvL5P8uzOb/Mc3m/zTO
5/850ej/QtTp/0zY6/9X3Oz/YN/t/2bh7v9o4u7/Z+Lu/2bi7v9m4e7/aOLu/2vj7v9u5e//c+bv/3no
8P+B6/L/jO/0/5fy9f+g9ff/pvf5/6r6+/+s/P3/qvz9/6P4+v+U7vL/fd7m/2HL1/9It8f/OKW1/zOU
ov84hI3/QnZ5/0xqaP9RYVz/VF1X/1RdVv9TXlf/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1Nf
Wf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NeV/9UXVb/VF1X/1FhXP9Mamj/QnZ5/ziE
jf8zlKL/OKW1/0i3x/9hy9f/fd7m/5Tu8v+j+Pr/qvz9/6z8/f+q+vv/pvf5/6D19/+X8vX/jO/0/4Hr
8v956PD/c+bv/27l7/9r4+7/aOLu/2bh7v9m4u7/Z+Lu/2ji7v9m4e7/YN/t/1fc7P9M2Ov/QtTp/znR
6P80zuf/Mc3m/y7M5v8ry+T/Jsjj/x7F4P8Vwd7/DL3b/wS52f8AuNj/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wK52P8Hu9r/EL/d/xvD4P8myOP/L8zl/zTO5/82z+f/Ns/o/zjQ
6P890un/RtXq/1La6/9f3+3/auPu/3Hl7/905/D/defw/3Tn8P905vD/dOfw/3Xn8P925/D/eOjw/3zp
8P+D6/H/jO3y/5bv8/+f8vT/pfP0/6r19f+t9vb/rPX1/6Xv8P+T4+b/ddDY/1K5xv8yobL/HYye/xd4
iP8dZXD/KFVY/zNHRP86PTf/PTkx/z04MP88OTH/PDoz/zw7M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7
M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7M/88OzP/PDoz/zw5Mf89ODD/PTkx/zo9N/8zR0T/KFVY/x1l
cP8XeIj/HYye/zKhsv9Sucb/ddDY/5Pj5v+l7/D/rPX1/6329v+q9fX/pfP0/5/y9P+W7/P/jO3y/4Pr
8f986fD/eOjw/3bn8P915/D/dOfw/3Tm8P905/D/defw/3Tn8P9x5e//auPu/1/f7f9S2uv/RtXq/z3S
6f840Oj/Ns/o/zbP5/80zuf/L8zl/ybI4/8bw+D/EL/d/we72v8Cudj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2v8AuNn/AbjY/wG42P8Cudn/BLrZ/wi72v8Ovtz/FsLe/yHG4f8ry+T/NM7n/znQ6P880en/PdLp/0DT
6f9F1er/Ttjr/1nc7P9l4e7/cOXv/3jo8P986fH/furx/4Dq8f+A6vH/gevy/4Hr8v+B7PL/gezz/4Pr
8v+F6/H/ierw/43o7v+R5+v/leXo/5nk5v+e4uP/n9/e/5nX1/+Iysz/are9/0ihrP8oipn/EnWF/wxi
cP8RUFn/HD9C/ycyL/8tKSH/LyQb/zAjGv8vJBz/LiYe/y4mHv8uJh7/LiYe/y4mHv8uJh7/LiYe/y4m
Hv8uJh7/LiYe/y4mHv8uJh7/LiYe/y4mHv8uJh7/LiYe/y8kHP8wIxr/LyQb/y0pIf8nMi//HD9C/xFQ
Wf8MYnD/EnWF/yiKmf9Ioaz/are9/4jKzP+Z19f/n9/e/57i4/+Z5Ob/leXo/5Hn6/+N6O7/ierw/4Xr
8f+D6/L/gezz/4Hs8v+B6/L/gevy/4Dq8f+A6vH/furx/3zp8f946PD/cOXv/2Xh7v9Z3Oz/Ttjr/0XV
6v9A0+n/PdLp/zzR6f850Oj/NM7n/yvL5P8hxuH/FsLe/w6+3P8Iu9r/BLrZ/wK52f8BuNj/AbjY/wC4
2f8Audr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2f8AuNj/AbjY/wS52f8Iu9r/DL3b/xG/3f8Xwt//H8Xh/yfJ4/8uzOb/Ns/n/zzR6f9B0+n/RdXq/0rX
6v9Q2ev/WNzs/2Hf7f9q4+7/c+bv/3rp8P+A6/H/huzy/4rt8v+N7vP/kPD0/5Hx9v+R8/f/kPP4/47x
9v+J7PP/g+bt/3ze5v921t7/dM7W/3jIzf9+wcT/grq6/4Cwr/9zo6P/XJOV/z+Bh/8lb3j/E11p/w5O
V/8RPkT/GDEx/yElIf8lHRb/JxoR/ycZEP8nGhH/JhsS/yYbE/8mGxP/JhsT/ycbE/8nGxP/JxsT/ycb
E/8nGxP/JxsT/ycbE/8nGxP/JhsT/yYbE/8mGxP/JhsS/ycaEf8nGRD/JxoR/yUdFv8hJSH/GDEx/xE+
RP8OTlf/E11p/yVveP8/gYf/XJOV/3Ojo/+AsK//grq6/37BxP94yM3/dM7W/3bW3v983ub/g+bt/4ns
8/+O8fb/kPP4/5Hz9/+R8fb/kPD0/43u8/+K7fL/huzy/4Dr8f966fD/c+bv/2rj7v9h3+3/WNzs/1DZ
6/9K1+r/RdXq/0HT6f880en/Ns/n/y7M5v8nyeP/H8Xh/xfC3/8Rv93/DL3b/wi72v8Eudn/AbjY/wC4
2P8Audn/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC5
2f8AuNj/ArjY/we62v8Ovdz/FcHe/xzE4P8jx+L/KMnk/yzL5f8xzeb/Ns/o/z3S6f9F1er/Tdjr/1bb
7P9d3u3/Y+Dt/2nj7v9u5e//dOfw/3vp8P+D6/H/i+7y/5Pw9P+Z8vX/nfT3/6D3+f+h+fz/n/n8/5n1
+f+M7PL/et/o/2bQ2/9WwM3/TrK//1CmsP9XmqD/X4+P/2KDgf9bd3T/TGtq/zpfYP8oVFf/G0hN/xc+
Qf8YMzP/HSkm/yEhG/8kGxP/JRkQ/yUYD/8lGRD/JRoR/yUaEf8lGhL/JRoS/yUaEv8lGhL/JRoS/yUa
Ev8lGhL/JRoS/yUaEv8lGhL/JRoS/yUaEv8lGhH/JRoR/yUZEP8lGA//JRkQ/yQbE/8hIRv/HSkm/xgz
M/8XPkH/G0hN/yhUV/86X2D/TGtq/1t3dP9ig4H/X4+P/1eaoP9QprD/TrK//1bAzf9m0Nv/et/o/4zs
8v+Z9fn/n/n8/6H5/P+g9/n/nfT3/5ny9f+T8PT/i+7y/4Pr8f976fD/dOfw/27l7/9p4+7/Y+Dt/13e
7f9W2+z/Tdjr/0XV6v890un/Ns/o/zHN5v8sy+X/KMnk/yPH4v8cxOD/FcHe/w693P8Hutr/ArjY/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC5
2f8AuNj/A7nZ/wq82/8TwN3/HsXg/yfJ4/8ty+X/MM3m/zLO5/80zuf/ONDo/0DT6f9K1+r/Vtvs/2Hf
7f9p4u7/buTv/3Hm7/9z5u//dufw/3zp8f+F7PL/j+/z/5ry9f+i9Pb/p/b3/6v5+v+t+/v/qvn7/6Dz
9v+M5uv/b9Pd/1G+zP84qbr/K5an/yuFkv8zdXz/PmZn/0VZVv9FT0n/P0dC/zZCPv8tPTr/Jzg2/yUz
Mf8lLir/Jyok/yomH/8rIxv/LCIZ/ywiGf8sIhr/KyIa/ysiGv8rIhr/LCIa/ywiGv8sIhr/LCMa/ywj
Gv8sIxr/LCMa/ywiGv8sIhr/LCIa/ysiGv8rIhr/KyIa/ywiGv8sIhn/LCIZ/ysjG/8qJh//Jyok/yUu
Kv8lMzH/Jzg2/y09Ov82Qj7/P0dC/0VPSf9FWVb/PmZn/zN1fP8rhZL/K5an/zipuv9Rvsz/b9Pd/4zm
6/+g8/b/qvn7/637+/+r+fr/p/b3/6L09v+a8vX/j+/z/4Xs8v986fH/dufw/3Pm7/9x5u//buTv/2ni
7v9h3+3/Vtvs/0rX6v9A0+n/ONDo/zTO5/8yzuf/MM3m/y3L5f8nyeP/HsXg/xPA3f8KvNv/A7nZ/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Cudn/Brva/w++3P8Zw9//Jcji/y7M5f81z+f/N9Do/zjQ6P850ej/PdLp/0XV6v9Q2ev/Xd7t/2ni
7v9y5u//d+fw/3jo8P956PD/e+nw/4Dq8f+I7fP/k/D0/53z9v+l9fb/qvX2/6719f+u9PP/qu/v/57m
5/+G1tv/ZcHK/0GpuP8kkqP/FH2P/xNqeP8cV1//KEhJ/zI7Nv82Myz/Ni8n/zQvJ/8yLyn/MTAq/zIx
K/81Miv/ODMs/zo0Lf88NS3/PTUt/z01Lf88NS3/PDUt/zw1Lf88NS3/PDQt/zw0Lf87NC3/OzQt/zs0
Lf87NC3/OzQt/zs0Lf88NC3/PDQt/zw1Lf88NS3/PDUt/zw1Lf89NS3/PTUt/zw1Lf86NC3/ODMs/zUy
K/8yMSv/MTAq/zIvKf80Lyf/Ni8n/zYzLP8yOzb/KEhJ/xxXX/8Tanj/FH2P/ySSo/9Bqbj/ZcHK/4bW
2/+e5uf/qu/v/6708/+u9fX/qvX2/6X19v+d8/b/k/D0/4jt8/+A6vH/e+nw/3no8P946PD/d+fw/3Lm
7/9p4u7/Xd7t/1DZ6/9F1er/PdLp/znR6P840Oj/N9Do/zXP5/8uzOX/Jcji/xnD3/8Pvtz/Brva/wK5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anbr/AKrI/wC00/8Cudn/A7vb/wa8
2/8JvNv/Dr7c/xbC3v8gxuH/Ksrk/zPO5/850ej/PdLp/z/T6f9C1On/RtXq/07Y6/9Y3Oz/Y+Dt/27k
7/935/D/fOnw/3/q8f+B6/H/g+vy/4jt8/+O8PX/lvP3/531+P+i9ff/pPHy/6Xr6/+j4uH/nNfW/4/J
yf94uLv/WaSr/ziPmv8deoj/Dmd1/wxUYP8TQ0n/HTQ0/ycpJP8tJBz/MCMb/zMmHv82KyT/OjEq/0A4
Mf9IQDn/UElC/1dQSf9bVU7/XVdR/15XUf9dV1H/XFZQ/1xWUP9bVk//W1VP/1pVT/9ZVU7/WVRO/1lU
Tv9ZVE7/WVRO/1lVTv9aVU//W1VP/1tWT/9cVlD/XFZQ/11XUf9eV1H/XVdR/1tVTv9XUEn/UElC/0hA
Of9AODH/OjEq/zYrJP8zJh7/MCMb/y0kHP8nKST/HTQ0/xNDSf8MVGD/Dmd1/x16iP84j5r/WaSr/3i4
u/+Pycn/nNfW/6Pi4f+l6+v/pPHy/6L19/+d9fj/lvP3/47w9f+I7fP/g+vy/4Hr8f9/6vH/fOnw/3fn
8P9u5O//Y+Dt/1jc7P9O2Ov/RtXq/0LU6f8/0+n/PdLp/znR6P8zzuf/Ksrk/yDG4f8Wwt7/Dr7c/wm8
2/8GvNv/A7vb/wK52f8AtNP/AKrI/wCduv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbr/AKrI/wG00/8Eutn/CL3d/w2/
3v8Twd7/GcPf/yDG4f8nyeP/L8zl/zbP5/880un/QtTq/0fW6v9M2Ov/Utrr/1nc7P9h3+3/aePu/3Hm
7/946PD/f+rx/4Ts8v+K7fL/ju7z/5Lw9P+W8/j/mff7/5v4/P+b9fj/mOvu/5Tc3P+OyMf/hLSx/3eh
nv9kkI//TH+C/zJvdf8eYGj/ElFa/xBCSP8UNDb/Gygm/yMgGv8oHhb/LiAY/zMmHv86Lyj/Qzo0/1BH
Qf9fWFL/b2lk/314c/+Hgn3/i4aC/4yHg/+LhoH/iYSA/4iEf/+Hg3//hYJ+/4SCff+DgX3/goF8/4KB
fP+CgXz/goF8/4OBff+Egn3/hYJ+/4eDf/+IhH//iYSA/4uGgf+Mh4P/i4aC/4eCff99eHP/b2lk/19Y
Uv9QR0H/Qzo0/zovKP8zJh7/LiAY/ygeFv8jIBr/Gygm/xQ0Nv8QQkj/ElFa/x5gaP8yb3X/TH+C/2SQ
j/93oZ7/hLSx/47Ix/+U3Nz/mOvu/5v1+P+b+Pz/mff7/5bz+P+S8PT/ju7z/4rt8v+E7PL/f+rx/3jo
8P9x5u//aePu/2Hf7f9Z3Oz/Utrr/0zY6/9H1ur/QtTq/zzS6f82z+f/L8zl/yfJ4/8gxuH/GcPf/xPB
3v8Nv97/CL3d/wS62f8BtNP/AKrI/wCduv8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbn/AKrI/wG00/8Gu9r/DcDe/xXD
4P8exeH/JMji/yrK5P8uzOX/Ms7n/zfQ6P890un/RdXq/07Y6/9X3Oz/X9/t/2Xh7v9q4+7/b+Xv/3Pm
7/956PD/gevx/4rt8v+S7/T/mfH1/5zz9v+c9vr/mvn9/5b4/f+Q8fb/iOHl/3/Iyv91qqn/aY2K/111
cf9PZWH/P1lX/zBQUP8kSEr/HT9B/xo1Nv8cLCr/ICQf/yUgGf8qIRn/MCUe/zcuKP9BOTT/TkhE/2Fb
WP95dHH/kY2K/6ajoP+1sq//u7i2/726t/+7uLX/ubaz/7e1sv+1tLH/s7Ow/7Gyr/+vsa7/rrCu/62w
rf+tsK3/rrCu/6+xrv+xsq//s7Ow/7W0sf+3tbL/ubaz/7u4tf+9urf/u7i2/7Wyr/+mo6D/kY2K/3l0
cf9hW1j/TkhE/0E5NP83Lij/MCUe/yohGf8lIBn/ICQf/xwsKv8aNTb/HT9B/yRISv8wUFD/P1lX/09l
Yf9ddXH/aY2K/3Wqqf9/yMr/iOHl/5Dx9v+W+P3/mvn9/5z2+v+c8/b/mfH1/5Lv9P+K7fL/gevx/3no
8P9z5u//b+Xv/2rj7v9l4e7/X9/t/1fc7P9O2Ov/RdXq/z3S6f830Oj/Ms7n/y7M5f8qyuT/JMji/x7F
4f8Vw+D/DcDe/wa72v8BtNP/AKrI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbn/AKnI/wK00/8IvNv/EsHf/xzG
4v8nyeT/Lszl/zLN5v80zuf/Nc/n/zjQ6P8+0un/SNbq/1Tb7P9g3+3/auPu/3Dl7/9z5u//dOfw/3bn
8P976fD/g+vy/47u8/+Z8fX/ofT2/6P09v+f9vn/mPb6/47y+P+D6O7/eNLX/2uytP9djYz/UGpm/0VP
Sf89QDr/NTk0/zA3Mv8sNjL/KTQw/ykvK/8pLCb/LCki/y8pIv81LSb/OjMt/0I9OP9NSkf/XVpZ/3Ry
cf+RkI//sK6t/8rJyP/c29r/5OPi/+bl4//k4+H/4eDf/9/f3v/d3tz/2tzb/9fb2v/V2tn/1NnY/9PZ
2P/T2dj/1NnY/9Xa2f/X29r/2tzb/93e3P/f397/4eDf/+Tj4f/m5eP/5OPi/9zb2v/Kycj/sK6t/5GQ
j/90cnH/XVpZ/01KR/9CPTj/OjMt/zUtJv8vKSL/LCki/yksJv8pLyv/KTQw/yw2Mv8wNzL/NTk0/z1A
Ov9FT0n/UGpm/12NjP9rsrT/eNLX/4Po7v+O8vj/mPb6/5/2+f+j9Pb/ofT2/5nx9f+O7vP/g+vy/3vp
8P925/D/dOfw/3Pm7/9w5e//auPu/2Df7f9U2+z/SNbq/z7S6f840Oj/Nc/n/zTO5/8yzeb/Lszl/yfJ
5P8cxuL/EsHf/wi82/8CtNP/AKnI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8JvNv/FMPg/yHI
4/8szOX/NM7n/zfQ6P830Oj/N9Do/zjQ6P8/0un/Stfq/1jc7P9m4e7/ceXv/3jo8P966fD/e+nw/3zp
8f+A6vH/iO3z/5Lw9P+c8/b/o/T2/6Pz9f+c8fP/kezw/4Tk6f921dr/ab3B/1uanP9MdHL/QFBM/zc3
MP8yKiP/MCcg/zEqIv8zLif/NTAq/zcyK/86NC3/Pjgx/0M9Nv9JQz3/T0pF/1dUUP9hYF7/cXFw/4iJ
if+mp6f/xsfH/+Li4v/09fT//P39//7//v/8/Pz/+fr5//f5+P/19/f/8vb2/+/19P/t9PP/6/Pz/+vz
8//r8/P/6/Pz/+308//v9fT/8vb2//X39//3+fj/+fr5//z8/P/+//7//P39//T19P/i4uL/xsfH/6an
p/+IiYn/cXFw/2FgXv9XVFD/T0pF/0lDPf9DPTb/Pjgx/zo0Lf83Miv/NTAq/zMuJ/8xKiL/MCcg/zIq
I/83NzD/QFBM/0x0cv9bmpz/ab3B/3bV2v+E5On/kezw/5zx8/+j8/X/o/T2/5zz9v+S8PT/iO3z/4Dq
8f986fH/e+nw/3rp8P946PD/ceXv/2bh7v9Y3Oz/Stfq/z/S6f840Oj/N9Do/zfQ6P830Oj/NM7n/yzM
5f8hyOP/FMPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8Kvdv/FcPg/yPI
5P8vzeb/N8/o/znR6f840On/N9Do/zjQ6P8+0un/Stfq/1nc7P9o4u7/dOfw/3zp8f+A6/H/g+vx/4Xs
8v+I7fP/jvD1/5bz+P+c9vr/n/b5/5zx8/+T5+r/htre/3fKzv9otrn/Wp2f/01+ff9AXVn/Nj85/zAr
I/8tIhn/LyEZ/zMnH/85Lif/QDYv/0g/OP9SSUP/XFRO/2VfWf9taGP/c3Bs/3h3df+AgYD/jI6O/6Ci
ov+5u7z/1NXV/+vs7P/7+/v///////////////////////7////8////+v7///j+/v/2/v7/9f7+//X+
/v/1/v7/9f7+//b+/v/4/v7/+v7///z////+//////////////////////////v7+//r7Oz/1NXV/7m7
vP+goqL/jI6O/4CBgP94d3X/c3Bs/21oY/9lX1n/XFRO/1JJQ/9IPzj/QDYv/zkuJ/8zJx//LyEZ/y0i
Gf8wKyP/Nj85/0BdWf9Nfn3/Wp2f/2i2uf93ys7/htre/5Pn6v+c8fP/n/b5/5z2+v+W8/j/jvD1/4jt
8/+F7PL/g+vx/4Dr8f986fH/dOfw/2ji7v9Z3Oz/Stfq/z7S6f840Oj/N9Do/zjQ6f850en/N8/o/y/N
5v8jyOT/FcPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8Kvdv/FsPg/yPJ
5P8vzeb/N9Do/znR6f840On/Ns/o/zfQ6P890un/Sdbq/1jc7P9n4u7/defw/37q8f+G7PL/i+7y/4/v
8/+T8PT/lvP3/5n3+/+a+f3/mPb6/5Hs8P+G2t7/d8PG/2epq/9YkJD/THh3/0FfXP84R0L/MTMt/y4n
H/8uIhr/MSQd/zcsJf9ANjH/S0M+/1tTTv9tZ2L/gHp2/4+Lh/+al5P/n52b/6Giof+lqKf/rLCw/7q+
vv/Mz9D/4OLi//Hy8v/8/Pz///////////////////////7////8////+v////n////3////9/////b/
///2////9/////f////5////+v////z////+//////////////////////////z8/P/x8vL/4OLi/8zP
0P+6vr7/rLCw/6Wop/+hoqH/n52b/5qXk/+Pi4f/gHp2/21nYv9bU07/S0M+/0A2Mf83LCX/MSQd/y4i
Gv8uJx//MTMt/zhHQv9BX1z/THh3/1iQkP9nqav/d8PG/4ba3v+R7PD/mPb6/5r5/f+Z9/v/lvP3/5Pw
9P+P7/P/i+7y/4bs8v9+6vH/defw/2fi7v9Y3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6f850en/N9Do/y/N
5v8jyeT/FsPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8KvNv/FcPg/yLI
5P8uzOb/Ns/o/znQ6P840Oj/Ns/o/zfQ6P890un/Sdbq/1fc7P9m4e7/dOfw/4Dq8f+K7fL/k/D0/5ry
9f+d8/b/nfX4/5v4/P+W+P3/jvL4/4Tk6f93ys7/Z6mr/1eIh/9Jamf/P1RQ/zhDPf8yNS//MC0l/y8o
IP8yKCH/Ni0n/z43Mv9JRED/WVRR/3Braf+KhoT/pKGf/7q3tf/GxMP/ysrJ/8rMy//Jzc3/y9DQ/9LY
2P/c4uL/5+3t//D29v/2/Pz/+f////r////5////+P7+//f+/v/3/f3/9v39//X8/P/0/Pz/8/z8//P8
/P/z/Pz/8/z8//T8/P/1/Pz/9v39//f9/f/3/v7/+P7+//n////6////+f////b8/P/w9vb/5+3t/9zi
4v/S2Nj/y9DQ/8nNzf/KzMv/ysrJ/8bEw/+6t7X/pKGf/4qGhP9wa2n/WVRR/0lEQP8+NzL/Ni0n/zIo
If8vKCD/MC0l/zI1L/84Qz3/P1RQ/0lqZ/9XiIf/Z6mr/3fKzv+E5On/jvL4/5b4/f+b+Pz/nfX4/53z
9v+a8vX/k/D0/4rt8v+A6vH/dOfw/2bh7v9X3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6P850Oj/Ns/o/y7M
5v8iyOT/FcPg/wq82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnI/wK00/8JvNv/FcPg/yLI
4/8tzOb/Ns/n/znQ6P850Oj/ONDo/zrR6P9A0+n/S9fq/1jc7P9m4e7/dObw/4Dq8f+N7vP/mfL1/6L0
9v+l9fb/ovX3/5v1+P+Q8fb/g+ju/3bV2v9otrn/WJCQ/0lqZ/8+S0b/Njgx/zEuJv8wKSL/MSoi/zQt
Jf85Miv/Pzo1/0lGQv9XVVP/amlo/4WEhP+kpKP/w8LC/9vb2v/o6ej/7O7t/+rt7f/l6+v/4+rq/+Xs
7P/o7/D/7PPz/+/29v/x+Pn/8vn5//L6+v/y+fn/8vn5//L5+f/x+fn/8fn5//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8fn5//H5+f/y+fn/8vn5//L5+f/y+vr/8vn5//H4+f/v9vb/7PPz/+jv
8P/l7Oz/4+rq/+Xr6//q7e3/7O7t/+jp6P/b29r/w8LC/6Sko/+FhIT/amlo/1dVU/9JRkL/Pzo1/zky
K/80LSX/MSoi/zApIv8xLib/Njgx/z5LRv9Jamf/WJCQ/2i2uf921dr/g+ju/5Dx9v+b9fj/ovX3/6X1
9v+i9Pb/mfL1/43u8/+A6vH/dObw/2bh7v9Y3Oz/S9fq/0DT6f860ej/ONDo/znQ6P850Oj/Ns/n/y3M
5v8iyOP/FcPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCQq/8Anbn/AKnH/wK00/8JvNv/FcPg/yHI
4/8tzOb/Ns/n/zvR6f880un/PtLp/0HT6f9H1ur/UNnr/1ze7P9o4u7/dOfw/4Hr8v+Q8PT/nfT3/6f2
9/+q9fb/pPHy/5jr7v+I4eX/eNLX/2m9wf9anZ//THh3/z9UUP82ODH/MCkh/y4jG/8vJRz/Myoj/zkz
LP9CPDf/TElF/1pYVv9ra2r/f4CA/5ucnP+6u7v/19jY/+7v7//6/Pz//f////r////1+/v/8fj4//D4
+P/v+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4/+/4
+P/w+Pj/8fj4//X7+//6/////f////r8/P/u7+//19jY/7q7u/+bnJz/f4CA/2trav9aWFb/TElF/0I8
N/85Myz/Myoj/y8lHP8uIxv/MCkh/zY4Mf8/VFD/THh3/1qdn/9pvcH/eNLX/4jh5f+Y6+7/pPHy/6r1
9v+n9vf/nfT3/5Dw9P+B6/L/dOfw/2ji7v9c3uz/UNnr/0fW6v9B0+n/PtLp/zzS6f870en/Ns/n/y3M
5v8hyOP/FcPg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wK00/8JvNv/FMLg/yHH
4/8tzOX/N8/n/z7S6f9C1Or/R9bq/0vX6v9S2uv/Wd3s/2Hg7f9r4+7/defw/4Hr8v+R8fb/oPf5/6v5
+v+u9fX/pevr/5Tc3P9/yMr/a7K0/1uanP9Nfn3/QV9c/zhDPf8xLib/LiMb/y4hGf8xJh//Ny8p/0A7
Nv9NSkb/Xlxa/3FxcP+Fh4f/mp2d/7K0tf/LzM3/4uPj//P09P/9/v7///////3////5////9f39//T8
/P/y+/v/8fr6//D5+f/w+Pj/7/j4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/7/j4//D4+P/w+fn/8fr6//L7
+//0/Pz/9f39//n////9//////////3+/v/z9PT/4uPj/8vMzf+ytLX/mp2d/4WHh/9xcXD/Xlxa/01K
Rv9AOzb/Ny8p/zEmH/8uIRn/LiMb/zEuJv84Qz3/QV9c/01+ff9bmpz/a7K0/3/Iyv+U3Nz/pevr/671
9f+r+fr/oPf5/5Hx9v+B6/L/defw/2vj7v9h4O3/Wd3s/1La6/9L1+r/R9bq/0LU6v8+0un/N8/n/y3M
5f8hx+P/FMLg/wm82/8CtNP/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wKz0/8JvNv/FMLg/yDH
4/8tzOX/ONDo/0HT6f9J1+v/Udnr/1jc7P9f3u3/ZOHt/2ni7v9u5e//dufw/4Hs8v+R8/f/ofn8/637
+/+u9PP/o+Lh/47Ix/91qqn/XY2M/0x0cv9AXVn/OEdC/zI1L/8wKSL/LyUc/zEmH/82LSf/Pjgz/0pH
Q/9cWlj/cnNx/4uNjP+jpqb/t7y8/8rOz//b39//6u3t//X4+P/7/v7//f////v////3/v7/9f39//P8
/P/y+/v/8fr6//D5+f/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+fn/8fr6//L7
+//z/Pz/9f39//f+/v/7/////f////v+/v/1+Pj/6u3t/9vf3//Kzs//t7y8/6Ompv+LjYz/cnNx/1xa
WP9KR0P/Pjgz/zYtJ/8xJh//LyUc/zApIv8yNS//OEdC/0BdWf9MdHL/XY2M/3Wqqf+OyMf/o+Lh/670
8/+t+/v/ofn8/5Hz9/+B7PL/dufw/27l7/9p4u7/ZOHt/1/e7f9Y3Oz/Udnr/0nX6/9B0+n/ONDo/y3M
5f8gx+P/FMLg/wm82/8Cs9P/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8Anbn/AKnH/wK00/8JvNv/E8Lg/yDH
4/8tzOX/OdDo/0TV6v9Q2ev/W93t/2Tg7v9r4+7/buTv/3Dl7/9z5u//eOjw/4Hs8/+Q8/j/n/n8/6r5
+/+q7+//nNfW/4S0sf9pjYr/UGpm/0BQTP82Pzn/MTMt/zAtJf8xKiL/Myoj/zcvKf8+ODP/SUVC/1hW
VP9tbWz/iIqJ/6Sop/++w8P/0djY/9/l5f/o7u//7vT1//L4+f/1/Pz/9v39//X8/P/z+/v/8vr6//H5
+f/x+fn/8Pn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pn5//H5
+f/x+fn/8vr6//P7+//1/Pz/9v39//X8/P/y+Pn/7vT1/+ju7//f5eX/0djY/77Dw/+kqKf/iIqJ/21t
bP9YVlT/SUVC/z44M/83Lyn/Myoj/zEqIv8wLSX/MTMt/zY/Of9AUEz/UGpm/2mNiv+EtLH/nNfW/6rv
7/+q+fv/n/n8/5Dz+P+B7PP/eOjw/3Pm7/9w5e//buTv/2vj7v9k4O7/W93t/1DZ6/9E1er/OdDo/y3M
5f8gx+P/E8Lg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRq/8Anbr/AarI/wS11P8Lvdz/FcPh/yHI
5P8tzOb/OtDo/0fW6v9U2+z/YeDt/2zk7/905u//d+jw/3jo8P956PD/fOnw/4Pr8v+O8fb/mfX5/6Dz
9v+e5uf/j8nJ/3ehnv9ddXH/RU9J/zc3MP8wKyP/Licf/y8oIP80LSX/OTMs/0A7Nv9KR0P/WFZU/2lo
aP+AgYH/nKCg/7q/v//T2tr/5ezs/+719f/x+Pn/8fj4//D4+P/x+Pj/8fn5//H4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+Pj/8fn5//H4+P/w+Pj/8fj4//H4+f/u9fX/5ezs/9Pa2v+6v7//nKCg/4CB
gf9paGj/WFZU/0pHQ/9AOzb/OTMs/zQtJf8vKCD/Licf/zArI/83NzD/RU9J/111cf93oZ7/j8nJ/57m
5/+g8/b/mfX5/47x9v+D6/L/fOnw/3no8P946PD/d+jw/3Tm7/9s5O//YeDt/1Tb7P9H1ur/OtDo/y3M
5v8hyOT/FcPh/wu93P8EtdT/AarI/wCduv8Akav/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AYeg/wOSrP8EoLv/B63K/wy51v8SwN7/GsXi/yTJ
5P8uzOb/OtDo/0fW6v9W2+z/ZOHu/3Dl7/956PD/furx/4Dr8v+B6/L/g+vx/4Xr8f+J7PP/jOzy/4zm
6/+G1tv/eLi7/2SQj/9PZWH/PUA6/zIqI/8tIhn/LiIa/zIoIf85Miv/Qjw3/01KRv9cWlj/bW1s/4CB
gf+Wmpr/sbW2/8vR0f/g6Oj/7/f3//X9/f/1/f3/8/v7//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/x+fn/8fn5//L6+v/y+vr/8vr6//L6+v/y+vr/8vr6//L6
+v/y+vr/8vr6//L6+v/y+vr/8vr6//L6+v/y+vr/8fn5//H5+f/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8/v7//X9/f/1/f3/7/f3/+Do6P/L0dH/sbW2/5aa
mv+AgYH/bW1s/1xaWP9NSkb/Qjw3/zkyK/8yKCH/LiIa/y0iGf8yKiP/PUA6/09lYf9kkI//eLi7/4bW
2/+M5uv/jOzy/4ns8/+F6/H/g+vx/4Hr8v+A6/L/furx/3no8P9w5e//ZOHu/1bb7P9H1ur/OtDo/y7M
5v8kyeT/GsXi/xLA3v8Mudb/B63K/wSgu/8Dkqz/AYeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/A4ig/waUrf8Lor3/EbHN/xa92f8cxOH/Isnk/yjL
5v8wzef/OdDo/0bV6v9V2+z/ZOHu/3Hl7/976fH/g+zy/4nu8/+M7/T/jO3y/4nq8P+D5u3/et/o/2/T
3f9lwcr/WaSr/0x/gv8/WVf/NTk0/zAnIP8vIRn/MSQd/zYtJ/8/OjX/TElF/15cWf9ycnH/iIqJ/5yg
oP+xtbb/xcvL/9jf3//o8PD/8vr6//b+/v/2/v7/8/v7//D5+f/w+Pj/7/j4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//L6+v/z+/v/9Pz8//T9/f/1/f3/9f7+//X+/v/2/v7/9v7///b+
///2/v//9v7///b+/v/1/v7/9f7+//X9/f/0/f3/9Pz8//P7+//y+vr/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4//D4+P/w+fn/8/v7//b+/v/2/v7/8vr6/+jw8P/Y39//xcvL/7G1
tv+coKD/iIqJ/3Jycf9eXFn/TElF/z86Nf82LSf/MSQd/y8hGf8wJyD/NTk0/z9ZV/9Mf4L/WaSr/2XB
yv9v093/et/o/4Pm7f+J6vD/jO3y/4zv9P+J7vP/g+zy/3vp8f9x5e//ZOHu/1Xb7P9G1er/OdDo/zDN
5/8oy+b/Isnk/xzE4f8Wvdn/EbHN/wuivf8GlK3/A4ig/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/BIih/wuVrv8Spb//G7XQ/yLC3P8nyeT/Kszn/y3N
5/8yzuf/OdDo/0XV6v9T2uz/Y+Dt/3Hl7/986fH/h+7z/5Hx9f+X8vX/lu/z/43o7v983ub/ZtDb/1G+
zP9Bqbj/OI+a/zJvdf8wUFD/MDcy/zEqIv8zJx//Nywl/z43Mv9JRkL/WlhW/3Fxb/+LjYz/pKin/7q/
v//L0dH/2N/f/+Tr6//s9PT/8vr6//T8/P/0/Pz/8vr6//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/7/j4//D4+P/w+Pj/8fn5//L6+v/z/Pz/9P39//X9/f/2/v7/9v7+//b////3////9/////f/
///3////9/////f////2////9v7+//b+/v/1/f3/9P39//P8/P/y+vr/8fn5//D4+P/w+Pj/7/j4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vr6//T8/P/0/Pz/8vr6/+z09P/k6+v/2N/f/8vR
0f+6v7//pKin/4uNjP9xcW//WlhW/0lGQv8+NzL/Nywl/zMnH/8xKiL/MDcy/zBQUP8yb3X/OI+a/0Gp
uP9Rvsz/ZtDb/3ze5v+N6O7/lu/z/5fy9f+R8fX/h+7z/3zp8f9x5e//Y+Dt/1Pa7P9F1er/OdDo/zLO
5/8tzef/Kszn/yfJ5P8iwtz/G7XQ/xKlv/8Lla7/BIih/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/BYmh/w6Xr/8ZqMH/I7nS/yzG3/8wzeb/MtDp/zPQ
6f820Oj/PNHo/0bV6v9T2uv/YuDt/3Dl7/996fH/i+/0/5jz9/+g9ff/n/L0/5Hn6/921t7/VsDN/zip
uv8kkqP/HXqI/x5gaP8kSEr/LDYy/zMuJ/85Lif/QDYx/0lEQP9XVVP/a2tq/4WHh/+jpqb/vsPD/9Pa
2v/g6Oj/6PDw/+z09P/u9vb/8Pj4//H5+f/x+fn/8fn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+fn/8fn5//H5+f/x+fn/8fn5//H5
+f/x+fn/8fn5//H5+f/x+fn/8fn5//D5+f/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//H5+f/x+fn/8Pj4/+729v/s9PT/6PDw/+Do
6P/T2tr/vsPD/6Ompv+Fh4f/a2tq/1dVU/9JRED/QDYx/zkuJ/8zLif/LDYy/yRISv8eYGj/HXqI/ySS
o/84qbr/VsDN/3bW3v+R5+v/n/L0/6D19/+Y8/f/i+/0/33p8f9w5e//YuDt/1Pa6/9G1er/PNHo/zbQ
6P8z0On/MtDp/zDN5v8sxt//I7nS/xmowf8Ol6//BYmh/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8AgZn/Bomh/xCYsP8dqsL/KbvU/zLJ4f840Oj/OdPr/zrT
6v880un/QdPp/0rX6v9W2+z/Y+Dt/3Dl7/996vH/jfD1/5z1+P+m9/n/pfP0/5Xl6P90ztb/TrK//yuW
p/8UfY//Dmd1/xJRWv8dP0H/KTQw/zUwKv9ANi//S0M+/1lUUf9qaWj/f4CA/5udnf+3vLz/0djY/+Xs
7P/v9/f/8vr6//L6+v/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+fn/8fn5//H5+f/w+Pj/7vX1/+vy8v/o7+//5ezs/+Pq6v/h6Oj/4Ofn/+Dm5v/f5uX/3+Xl/9/l
5P/f5eT/3+Xl/9/m5f/g5ub/4Ofn/+Ho6P/j6ur/5ezs/+jv7//r8vL/7vX1//D4+P/x+fn/8fn5//H5
+f/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/y+vr/8vr6/+/3
9//l7Oz/0djY/7e8vP+bnZ3/f4CA/2ppaP9ZVFH/S0M+/0A2L/81MCr/KTQw/x0/Qf8SUVr/Dmd1/xR9
j/8rlqf/TrK//3TO1v+V5ej/pfP0/6b3+f+c9fj/jfD1/33q8f9w5e//Y+Dt/1bb7P9K1+r/QdPp/zzS
6f860+r/OdPr/zjQ6P8yyeH/KbvU/x2qwv8QmLD/Bomh/wCBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xGYsP8eqsL/K7zU/zXK4v880un/QNXs/0PW
7P9G1ur/S9fq/1Pa6/9c3uz/ZuHu/3Hl7/996vH/jvH2/573+v+q+vv/qvX1/5nk5v94yM3/UKaw/yuF
kv8Tanj/DFRg/xBCSP8aNTb/KS8r/zcyK/9IPzj/W1NO/3Braf+FhIT/m5yc/7O2tv/Kz9D/3+Xl/+71
9f/1/f3/9v7+//T8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//L5
+f/0+/v/9v39//b9/f/0+vr/7fPz/+Pp6f/Z39//0NbW/8rPz//Fysr/wsfG/8DEw/++wsD/vcG//73A
vv+9wL7/vcG//77CwP/AxMP/wsfG/8XKyv/Kz8//0NbW/9nf3//j6en/7fPz//T6+v/2/f3/9v39//T7
+//y+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/0/Pz/9v7+//X9
/f/u9fX/3+Xl/8rP0P+ztrb/m5yc/4WEhP9wa2n/W1NO/0g/OP83Miv/KS8r/xo1Nv8QQkj/DFRg/xNq
eP8rhZL/UKaw/3jIzf+Z5Ob/qvX1/6r6+/+e9/r/jvH2/33q8f9x5e//ZuHu/1ze7P9T2uv/S9fq/0bW
6v9D1uz/QNXs/zzS6f81yuL/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xGYsP8eqsL/K7zU/zbL4v8/0+r/Rtft/0zZ
7f9S2uz/WNzs/17e7f9k4e3/auPu/3Lm7/996vH/jfH2/5/5/P+s/P3/rfb2/57i4/9+wcT/V5qg/zN1
fP8cV1//E0NJ/xQ0Nv8cLCr/KSwm/zo0Lf9SSUP/bWdi/4qGhP+kpKP/uru7/8zP0P/b4OH/6O7v//H4
+P/1/f3/9v7+//T8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//P6
+v/4/f3//P////z+/v/3+Pj/6uzs/9nb2//Gycn/tbm5/6mtrf+hpKP/m56c/5iZlv+VlZL/kpKP/5GR
jf+RkY3/kpKP/5WVkv+YmZb/m56c/6Gko/+pra3/tbm5/8bJyf/Z29v/6uzs//f4+P/8/v7//P////j9
/f/z+vr/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/0/Pz/9v7+//X9
/f/x+Pj/6O7v/9vg4f/Mz9D/uru7/6Sko/+KhoT/bWdi/1JJQ/86NC3/KSwm/xwsKv8UNDb/E0NJ/xxX
X/8zdXz/V5qg/37BxP+e4uP/rfb2/6z8/f+f+fz/jfH2/33q8f9y5u//auPu/2Th7f9e3u3/WNzs/1La
7P9M2e3/Rtft/z/T6v82y+L/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/B4mh/xCYsP8dqsL/KrzU/zbK4v9B1Or/S9nt/1Xd
7v9d3+3/ZeHu/2nj7v9s5O7/cOXv/3Xn8P996vH/jPH3/535/P+q/P3/rPX1/5/f3v+Curr/X4+P/z5m
Z/8oSEn/HTQ0/xsoJv8gJB//LCki/z44Mf9cVE7/gHp2/6Shn//DwsL/19jY/+Pm5//q7+//7vT1//H4
+P/z+/v/8/v7//L6+v/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4/+/4+P/v+Pj/8Pj4//T6
+v/5/v7//f////3////19vb/4+Pk/8rLzP+wsbL/mJqa/4iJif98fXv/dHNw/25saP9qZ2L/Z2Ne/2Vi
XP9lYlz/Z2Ne/2pnYv9ubGj/dHNw/3x9e/+IiYn/mJqa/7Cxsv/Ky8z/4+Pk//X29v/9/////f////n+
/v/0+vr/8Pj4/+/4+P/v+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/y+vr/8/v7//P7
+//x+Pj/7vT1/+rv7//j5uf/19jY/8PCwv+koZ//gHp2/1xUTv8+ODH/LCki/yAkH/8bKCb/HTQ0/yhI
Sf8+Zmf/X4+P/4K6uv+f397/rPX1/6r8/f+d+fz/jPH3/33q8f915/D/cOXv/2zk7v9p4+7/ZeHu/13f
7f9V3e7/S9nt/0HU6v82yuL/KrzU/x2qwv8QmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8cqsL/KbvU/zXK4v9C1Or/T9vt/1zf
7/9n4u//b+Xv/3Pm7/915/D/dufw/3jo8P9/6vH/i/D2/5n2+v+j+Pr/pe/w/5nX1/+AsK//YoOB/0VZ
Vv8yOzb/Jykk/yMgGv8lIBn/Lyki/0M9Nv9lX1n/j4uH/7q3tf/b29r/7u/v//X4+f/1+vr/8vj5//D4
+P/w+Pj/8Pn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//P6
+v/4/f3/+/7+//n7+//u7+//2NjY/7q7u/+am5v/fn9//2tqaf9dW1n/U1BM/01IQv9IQjv/RD02/0I7
NP9COzT/RD02/0hCO/9NSEL/U1BM/11bWf9ramn/fn9//5qbm/+6u7v/2NjY/+7v7//5+/v/+/7+//j9
/f/z+vr/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pn5//D4
+P/w+Pj/8vj5//X6+v/1+Pn/7u/v/9vb2v+6t7X/j4uH/2VfWf9DPTb/Lyki/yUgGf8jIBr/Jykk/zI7
Nv9FWVb/YoOB/4Cwr/+Z19f/pe/w/6P4+v+Z9vr/i/D2/3/q8f946PD/dufw/3Xn8P9z5u//b+Xv/2fi
7/9c3+//T9vt/0LU6v81yuL/KbvU/xyqwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Udzu/2Dh
7/9s5O//defw/3rp8P996vH/furx/3/q8f+C6vH/ie3z/5Dw9f+U7vL/k+Pm/4jKzP9zo6P/W3d0/0VP
Sf82Myz/LSQc/ygeFv8qIRn/NS0m/0lDPf9taGP/mpaT/8bEw//o6ej/+vz8///////7////9fz8//H4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//L6+v/z+vr/8vn5//H3
9v/x9PT/7vDv/+bn5v/Y19b/wcC//6Oiof+Eg4L/aWhn/1ZUUv9IRUL/Pzo1/zgyK/8zLCT/Lycf/y0l
HP8tJRz/Lycf/zMsJP84Miv/Pzo1/0hFQv9WVFL/aWhn/4SDgv+joqH/wcC//9jX1v/m5+b/7vDv//H0
9P/x9/b/8vn5//P6+v/y+vr/8fn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+Pj/9fz8//v/////////+vz8/+jp6P/GxMP/mpaT/21oY/9JQz3/NS0m/yohGf8oHhb/LSQc/zYz
LP9FT0n/W3d0/3Ojo/+Iysz/k+Pm/5Tu8v+Q8PX/ie3z/4Lq8f9/6vH/furx/33q8f966fD/defw/2zk
7/9g4e//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Utzu/2Hh
7/9u5e//eOjw/3/r8f+E7fL/h+3z/4jt8v+I6/H/hunw/4Lm7f993ub/ddDY/2q3vf9ck5X/TGtq/z9H
Qv82Lyf/MCMb/y4gGP8wJh7/OjMt/09KRf9zb2v/npyZ/8rIx//s6+v//f7+///////8////9vz8//H4
+P/w+Pj/7/j4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/x+fn/9Pz8//j+/v/5////9vv7/+/z
8v/k5uX/19fV/8fFw/+0sq//npuY/4WCf/9saWf/V1RR/0dDP/87NjH/Miwm/ywlHv8nHxf/JBsT/yIZ
EP8iGRD/JBsT/ycfF/8sJR7/Miwm/zs2Mf9HQz//V1RR/2xpZ/+Fgn//npuY/7Syr//HxcP/19fV/+Tm
5f/v8/L/9vv7//n////4/v7/9Pz8//H5+f/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/7/j4//D4
+P/x+Pj/9vz8//z//////////f7+/+zr6//KyMf/npyZ/3Nva/9PSkX/OjMt/zAmHv8uIBj/MCMb/zYv
J/8/R0L/TGtq/1yTlf9qt73/ddDY/33e5v+C5u3/hunw/4jr8f+I7fL/h+3z/4Tt8v9/6/H/eOjw/27l
7/9h4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Utzu/2Dh
7/9u5e//eejw/4Ps8v+M7/T/kvH1/5Pw9P+P6/D/g+Tr/3PZ4/9hy9f/UrnG/0ihrP8/gYf/Ol9g/zZC
Pv80Lyf/MyYe/zMmHv83Lij/Qj04/1dTUP94d3T/oaGg/8rLyv/q7Oz/+v7+//7////7////9fz8//H4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/y+fn/9/39//z////+////+fn5/+rp
6P/U0tD/ure0/6CcmP+KhYH/dnFt/2VgW/9VUEv/R0I9/zw3Mf8zLSf/LSYf/yggGf8kHBT/IhkQ/yEY
D/8hGA//IhkQ/yQcFP8oIBn/LSYf/zMtJ/88NzH/R0I9/1VQS/9lYFv/dnFt/4qFgf+gnJj/ure0/9TS
0P/q6ej/+fn5//7////8////9/39//L5+f/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/x+Pj/9fz8//v////+////+v7+/+rs7P/Ky8r/oaGg/3h3dP9XU1D/Qj04/zcuKP8zJh7/MyYe/zQv
J/82Qj7/Ol9g/z+Bh/9Ioaz/UrnG/2HL1/9z2eP/g+Tr/4/r8P+T8PT/kvH1/4zv9P+D7PL/eejw/27l
7/9g4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1er/Udzu/1/g
7/9t5O//eejw/4Xt8/+S8fX/m/T3/53y9f+V6+//gN7l/2TM2P9It8f/MqGy/yiKmf8lb3j/KFRX/y09
Ov8yLyn/Nisk/zovKP9BOTT/TUpH/2FgXv+AgYD/paen/8nNzf/l6+v/9fv7//n////3////8/v7//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/v+Pj/7/j4//D4+P/z+vr/+P7+//7/////////9/f3/+Hg
3//Bvrv/nJiU/3p1cP9hW1X/UUtF/0dBOv9BOjT/PDUv/zYwKf8yKyT/Lycg/ywkHP8qIhr/KSEY/ygg
F/8oIBf/KSEY/yoiGv8sJBz/Lycg/zIrJP82MCn/PDUv/0E6NP9HQTr/UUtF/2FbVf96dXD/nJiU/8G+
u//h4N//9/f3///////+////+P7+//P6+v/w+Pj/7/j4/+/4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8/v7//f////5////9fv7/+Xr6//Jzc3/paen/4CBgP9hYF7/TUpH/0E5NP86Lyj/Nisk/zIv
Kf8tPTr/KFRX/yVveP8oipn/MqGy/0i3x/9kzNj/gN7l/5Xr7/+d8vX/m/T3/5Lx9f+F7fP/eejw/23k
7/9f4O//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4ft8/+X8/f/ovb4/6X09v+a6+3/f9jf/1vAy/84pbX/HYye/xJ1hf8TXWn/G0hN/yc4
Nv8xMCr/OjEq/0M6NP9OSET/XVpZ/3FxcP+Njo7/rLCw/8vQ0P/j6ur/8fj4//X9/f/1/f3/8vr6//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H4+P/y+fn/9vz8//n9/f/3+fn/7Ozs/9LQ
z/+sqaX/gn14/1xWUP9DPDX/Ny8o/zMsJP80LSX/Ni8n/zYvKP82Lyj/NzAp/zgxKf85Mir/OjIq/zoy
Kv86Mir/OjIq/zkyKv84MSn/NzAp/zYvKP82Lyj/Ni8n/zQtJf8zLCT/Ny8o/0M8Nf9cVlD/gn14/6yp
pf/S0M//7Ozs//f5+f/5/f3/9vz8//L5+f/x+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8vr6//X9/f/1/f3/8fj4/+Pq6v/L0ND/rLCw/42Ojv9xcXD/XVpZ/05IRP9DOjT/OjEq/zEw
Kv8nODb/G0hN/xNdaf8SdYX/HYye/ziltf9bwMv/f9jf/5rr7f+l9Pb/ovb4/5fz9/+H7fP/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4ju9P+Z9Pj/pfj6/6j19v+d6ev/gNLX/1q0vv8zlKL/F3iI/wxicP8OTlf/Fz5B/yUz
Mf8zMSv/QDgx/1BHQf9hW1j/dHJx/4iJif+go6P/ur6//9LY2P/l7Oz/8Pj4//T8/P/z/Pz/8fn5//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//L5+f/z+/v/9Pv7//P6+v/x9/b/7/Pz/+vt7P/i4uH/0tDP/7e0
sf+Sjon/a2Vf/0lCO/80LCT/KyMb/ysjG/8vKCH/Ni8o/zs0Lv9COzX/SUM8/1BJQ/9VT0j/WFJL/1pT
Tf9aU03/WFJL/1VPSP9QSUP/SUM8/0I7Nf87NC7/Ni8o/y8oIf8rIxv/KyMb/zQsJP9JQjv/a2Vf/5KO
if+3tLH/0tDP/+Li4f/r7ez/7/Pz//H39v/z+vr/9Pv7//P7+//y+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8fn5//P8/P/0/Pz/8Pj4/+Xs7P/S2Nj/ur6//6Cjo/+IiYn/dHJx/2FbWP9QR0H/QDgx/zMx
K/8lMzH/Fz5B/w5OV/8MYnD/F3iI/zOUov9atL7/gNLX/53p6/+o9fb/pfj6/5n0+P+I7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4nu9P+Z9fn/pvn7/6r29v+f5+j/g8zP/16pr/84hI3/HWVw/xFQWf8RPkT/GDMz/yUu
Kv81Miv/SEA6/2BYU/95dHH/kZCP/6enp/+6vb3/zdHR/9zi4v/o8PD/7/j4//L7+//y+/v/8fn5//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//T7+//4/v7/+v////j9/f/x9PT/5Obl/9TU0//BwL3/rKml/5KO
if90bmn/Vk9I/z01Lf8tJR3/KCAZ/yojHP8yKyX/OzYw/0ZBO/9UT0r/ZF9a/3Nuaf9+eXT/hH97/4iD
fv+Ig37/hH97/355dP9zbmn/ZF9a/1RPSv9GQTv/OzYw/zIrJf8qIxz/KCAZ/y0lHf89NS3/Vk9I/3Ru
af+Sjon/rKml/8HAvf/U1NP/5Obl//H09P/4/f3/+v////j+/v/0+/v/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8fn5//L7+//y+/v/7/j4/+jw8P/c4uL/zdHR/7q9vf+np6f/kZCP/3l0cf9gWFP/SEA6/zUy
K/8lLir/GDMz/xE+RP8RUFn/HWVw/ziEjf9eqa//g8zP/5/n6P+q9vb/pvn7/5n1+f+J7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9P+Z9vn/pfr8/6n19v+g5eX/h8bH/2SeoP9Cdnn/KFVY/xw/Qv8YMTH/HSkm/ycq
JP84Myz/UElC/3BpZP+RjYr/sK+t/8bHx//W2Nj/4OTl/+ft7f/s8/P/8Pj4//H6+v/x+fn/8Pn5//D4
+P/w+Pj/8Pj4/+/4+P/w+Pj/8fn5//b8/P/8//////////v8/P/u7ez/19XT/7q3tP+dmJX/gn14/2tl
X/9WT0j/RDw0/zYuJv8uJh7/LSUe/zErJP85NC//RUE9/1VRTv9rZ2T/g4B9/5qWk/+rqKX/tbGu/7m2
s/+5trP/tbGu/6uopf+alpP/g4B9/2tnZP9VUU7/RUE9/zk0L/8xKyT/LSUe/y4mHv82Lib/RDw0/1ZP
SP9rZV//gn14/52Ylf+6t7T/19XT/+7t7P/7/Pz///////z////2/Pz/8fn5//D4+P/v+Pj/8Pj4//D4
+P/w+Pj/8Pn5//H5+f/x+vr/8Pj4/+zz8//n7e3/4OTl/9bY2P/Gx8f/sK+t/5GNiv9waWT/UElC/zgz
LP8nKiT/HSkm/xgxMf8cP0L/KFVY/0J2ef9knqD/h8bH/6Dl5f+p9fb/pfr8/5n2+f+I7/T/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+Y9vr/pPr8/6j19v+h4+P/isHA/2uVlP9Mamj/M0dE/ycyL/8hJSH/ISEb/yom
H/86NC3/V1BJ/314c/+no6D/ysnI/+Li4v/t7/D/8fX1//D29v/v9vb/8Pj4//D5+f/w+fn/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8fn5//b9/f/8//////////n7+//m5+b/x8XD/6Cdmf96dXD/XFZQ/0lC
O/89NS3/Ni4m/zMrI/8zKyT/NS8o/zs2Mf9FQj7/VFFP/2dmZP+CgYD/oZ+e/728u//T0dD/393c/+Xk
4v/l5OL/393c/9PR0P+9vLv/oZ+e/4KBgP9nZmT/VFFP/0VCPv87NjH/NS8o/zMrJP8zKyP/Ni4m/z01
Lf9JQjv/XFZQ/3p1cP+gnZn/x8XD/+bn5v/5+/v///////z////2/f3/8fn5//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D5+f/w+fn/8Pj4/+/29v/w9vb/8fX1/+3v8P/i4uL/ysnI/6ejoP99eHP/V1BJ/zo0
Lf8qJh//ISEb/yElIf8nMi//M0dE/0xqaP9rlZT/isHA/6Hj4/+o9fb/pPr8/5j2+v+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9vv/o/r9/6j19v+h4uH/jL27/2+Pi/9RYVz/Oj03/y0pIf8lHRb/JBwT/ysj
G/88NC3/W1VO/4aBff+0sa7/29vZ//P09P/8////+/////b8/P/x+fn/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//T6+v/3/Pz/9/r6/+7v7//Y19b/tLKv/4qFgf9hW1X/Qzw1/zQs
JP8tJR3/LiYe/zMrJP84MSv/Pzo0/0lFQf9VU1H/ZmVk/3t8e/+YmZn/uLm5/9bX1v/s7e3/+fr5////
////////+fr5/+zt7f/W19b/uLm5/5iZmf97fHv/ZmVk/1VTUf9JRUH/Pzo0/zgxK/8zKyT/LiYe/y0l
Hf80LCT/Qzw1/2FbVf+KhYH/tLKv/9jX1v/u7+//9/r6//f8/P/0+vr/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//H5+f/2/Pz/+/////z////z9PT/29vZ/7Sxrv+GgX3/W1VO/zw0
Lf8rIxv/JBwT/yUdFv8tKSH/Oj03/1FhXP9vj4v/jL27/6Hi4f+o9fb/o/r9/5f2+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GMiP9UXVf/PTkx/y8kG/8nGhH/JRkQ/ywi
Gv88NS3/XFZQ/4mEgP+4tbP/4eDe//n6+f////////////r////1/Pz/8/v7//P7+//z+/v/8/v7//P7
+//z/Pz/9Pz8//T8/f/z+/v/8fj4/+/19f/s8PH/5ejo/9jZ2f/BwL//npuY/3Zxbf9RS0T/Ny8o/ysj
G/8oIBn/LSUe/zUvKP8/OjT/S0dD/1pYVf9ra2n/fn9//5SWlv+usLD/ysvL/+Pk5P/29vb/////////
//////////////b29v/j5OT/ysvL/66wsP+Ulpb/fn9//2traf9aWFX/S0dD/z86NP81Lyj/LSUe/ygg
Gf8rIxv/Ny8o/1FLRP92cW3/npuY/8HAv//Y2dn/5ejo/+zw8f/v9fX/8fj4//P7+//0/P3/9Pz8//P8
/P/z+/v/8/v7//P7+//z+/v/8/v7//X8/P/6///////////////5+vn/4eDe/7i1s/+JhID/XFZQ/zw1
Lf8sIhr/JRkQ/ycaEf8vJBv/PTkx/1RdV/9xjIj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jbu4/3GMh/9UXVb/PTgw/zAjGv8nGRD/JRkQ/ywi
Gf88NS3/XFZQ/4mEgP+4tbL/4eDe//n6+v////////////3////4////9v////b////2////9v////b/
///3////+P////n////3////8fn5/+ju7//c4eH/zdDQ/7u7u/+joqH/hYJ//2RfW/9HQTr/Mywk/ysj
G/8qIxz/MSsk/zs2Mf9JRUH/WlhV/25ubP+Fh4b/m56e/7CztP/FyMj/2dzc/+vs7P/4+fn/////////
//////////////j5+f/r7Oz/2dzc/8XIyP+ws7T/m56e/4WHhv9ubmz/WlhV/0lFQf87NjH/MSsk/yoj
HP8rIxv/Mywk/0dBOv9kX1v/hYJ//6Oiof+7u7v/zdDQ/9zh4f/o7u//8fn5//f////5////+P////f/
///2////9v////b////2////9v////j////9///////////////5+vr/4eDe/7i1sv+JhID/XFZQ/zw1
Lf8sIhn/JRkQ/ycZEP8wIxr/PTgw/1RdVv9xjIf/jbu4/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GNiP9TXlf/PDkx/y8kHP8nGhH/JRkQ/ywi
Gv88NS3/XFZQ/4iEgP+3tbL/4ODe//j6+v////////////z////3////9v////b+///2/v//9v7///b/
///3////+f////n////2////7fX1/93k5P/Jzs7/srW1/5ucnP+Eg4L/bGlm/1VQS/9BOjT/NC0l/y8o
If8yKyX/OTQv/0VCPv9VU1H/a2tp/4WHhv+go6P/uL29/8vQ0f/a4OD/5evs/+709P/1+/v/+v////z/
///8////+v////X7+//u9PT/5evs/9rg4P/L0NH/uL29/6Cjo/+Fh4b/a2tp/1VTUf9FQj7/OTQv/zIr
Jf8vKCH/NC0l/0E6NP9VUEv/bGlm/4SDgv+bnJz/srW1/8nOzv/d5OT/7fX1//b////5////+f////f/
///2////9v7///b+///2/v//9v////f////8///////////////4+vr/4ODe/7e1sv+IhID/XFZQ/zw1
Lf8sIhr/JRkQ/ycaEf8vJBz/PDkx/1NeV/9xjYj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3CNif9TX1n/PDoz/y8mHv8nGxP/JRoS/ywi
Gv87NC3/WVRO/4KAfP+usK3/1NjX/+vy8f/0/Pz/9f39//L5+f/u9vb/7fX1/+319f/t9fX/7fX1/+31
9f/v9/f/8fn5//L6+v/u9vX/4urp/87U1P+0uLj/mJqa/35/fv9paGf/V1RR/0dCPf88NS//Ni8n/zYv
KP87NjD/RUE9/1RRT/9mZWT/fn9//5uenv+4vb3/0dfX/+Ho6P/q8fH/7vX1//D39//x+Pj/8/r6//T7
+//0+/v/8/r6//H4+P/w9/f/7vX1/+rx8f/h6Oj/0dfX/7i9vf+bnp7/fn9//2ZlZP9UUU//RUE9/zs2
MP82Lyj/Ni8n/zw1L/9HQj3/V1RR/2loZ/9+f37/mJqa/7S4uP/O1NT/4urp/+729f/y+vr/8fn5/+/3
9//t9fX/7fX1/+319f/t9fX/7fX1/+729v/y+fn/9f39//T8/P/r8vH/1NjX/66wrf+CgHz/WVRO/zs0
Lf8sIhr/JRoS/ycbE/8vJh7/PDoz/1NfWf9wjYn/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8mHv8nHBT/JhsT/ywj
G/86Myv/VE9I/3h2cf+en5z/v8PB/9Ta2P/d4+L/3uTj/9vh4P/Y3t3/2N7d/9je3f/Y3t3/2N7d/9je
3f/Z397/3OLh/9zi4f/Y3t3/zdLR/7i8u/+doJ//gYKB/2hoZv9WVFL/R0RA/z03Mv83MCn/Ni8o/zs0
Lv9GQTv/VVFO/2dmZP97fHv/lJaW/7C0tP/L0NH/4ejo/+729v/z+/v/9Pz8//L6+v/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/y+vr/9Pz8//P7+//u9vb/4ejo/8vQ0f+wtLT/lJaW/3t8e/9nZmT/VVFO/0ZB
O/87NC7/Ni8o/zcwKf89NzL/R0RA/1ZUUv9oaGb/gYKB/52gn/+4vLv/zdLR/9je3f/c4uH/3OLh/9nf
3v/Y3t3/2N7d/9je3f/Y3t3/2N7d/9je3f/b4eD/3uTj/93j4v/U2tj/v8PB/56fnP94dnH/VE9I/zoz
K/8sIxv/JhsT/yccFP8vJh7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8mHv8oHRX/Jx0U/y0k
G/84MCn/TEZA/2hlX/+GhYH/oKGe/7CzsP+3urj/uLu5/7a5tv+ztrT/s7a0/7O2tP+ztrT/s7a0/7O2
tP+0t7X/trm3/7e6t/+0t7T/qqyq/5iamP+CgoD/ampn/1ZUUv9IRUH/PTg0/zUvKf8zLCX/Ni8o/0I7
Nf9UT0r/a2dk/4KBgP+YmZn/r7Gy/8XKyv/a4OD/6vHx//P7+//2////9f7+//L7+//w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+/v/9f7+//b////z+/v/6vHx/9rg4P/Fysr/r7Gy/5iZmf+CgYD/a2dk/1RP
Sv9COzX/Ni8o/zMsJf81Lyn/PTg0/0hFQf9WVFL/ampn/4KCgP+Ympj/qqyq/7S3tP+3urf/trm3/7S3
tf+ztrT/s7a0/7O2tP+ztrT/s7a0/7O2tP+2ubb/uLu5/7e6uP+ws7D/oKGe/4aFgf9oZV//TEZA/zgw
Kf8tJBv/Jx0U/ygdFf8vJh7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8nH/8pHhb/KR4W/y0k
HP81Lib/Qzw1/1VRSv9pZmH/enl0/4WFgP+KioX/ioqG/4mJhP+Ih4P/iIeD/4iHg/+Ih4P/iIeD/4iH
g/+IiIP/iomF/4qKhf+Ih4P/gYB8/3V0b/9mY1//VlNO/0hEQP8+OTT/NjAq/zApI/8wKSH/NzAp/0lD
PP9kX1r/g4B9/6Gfnv+4ubn/y83O/9re3v/l6+z/7vX1//T8/P/1/v7/9Pz8//L6+v/w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+vr/9Pz8//X+/v/0/Pz/7vX1/+Xr7P/a3t7/y83O/7i5uf+hn57/g4B9/2Rf
Wv9JQzz/NzAp/zApIf8wKSP/NjAq/z45NP9IRED/VlNO/2ZjX/91dG//gYB8/4iHg/+KioX/iomF/4iI
g/+Ih4P/iIeD/4iHg/+Ih4P/iIeD/4iHg/+JiYT/ioqG/4qKhf+FhYD/enl0/2lmYf9VUUr/Qzw1/zUu
Jv8tJBz/KR4W/ykeFv8vJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/y8nH/8qHxf/KyAY/y4l
Hf8zKyP/OjMr/0M9Nv9OSEL/V1JM/1xYUv9fW1X/X1tV/19aVP9eWlT/XlpT/15aU/9eWlP/XlpT/15a
U/9eWlT/X1tV/19bVf9eWlT/WlZQ/1RQSv9MR0H/RD84/z03Mf83MSv/MSoj/y0lHv8uJh//ODEp/1BJ
Q/9zbmn/mpaT/728u//W19b/5Obn/+vw8P/u9PT/8Pf3//L6+v/y+/v/8vr6//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8vr6//L7+//y+vr/8Pf3/+709P/r8PD/5Obn/9bX1v+9vLv/mpaT/3Nu
af9QSUP/ODEp/y4mH/8tJR7/MSoj/zcxK/89NzH/RD84/0xHQf9UUEr/WlZQ/15aVP9fW1X/X1tV/15a
VP9eWlP/XlpT/15aU/9eWlP/XlpT/15aVP9fWlT/X1tV/19bVf9cWFL/V1JM/05IQv9DPTb/OjMr/zMr
I/8uJR3/KyAY/yofF/8vJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8rIBj/LCEZ/y4m
Hf8xKSH/Mysj/zYvJ/85Mir/PDUu/z43MP8/ODD/Pzgw/z44MP8+NzD/Pjcw/z43MP8+NzD/Pjcw/z43
MP8+NzD/Pjgw/z44MP8+NzD/PTYv/zs0Lf85Miv/Ny8o/zUtJv8yKyP/LSYe/yoiGv8tJR3/OTIq/1VP
SP9+eXT/q6il/9PR0P/s7e3/9/r6//n9/f/1+/v/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//X7+//5/f3/9/r6/+zt7f/T0dD/q6il/355
dP9VT0j/OTIq/y0lHf8qIhr/LSYe/zIrI/81LSb/Ny8o/zkyK/87NC3/PTYv/z43MP8+ODD/Pjgw/z43
MP8+NzD/Pjcw/z43MP8+NzD/Pjcw/z43MP8+ODD/Pzgw/z84MP8+NzD/PDUu/zkyKv82Lyf/Mysj/zEp
If8uJh3/LCEZ/ysgGP8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKCD/MCcf/y8nHv8vJh3/LyYd/y8mHP8vJRz/LiUc/y8lHP8vJRz/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJRz/LyUc/y4lHP8vJRz/LyYc/y8mHf8vJh3/MCce/zAnH/8vJx7/KyMa/ykgGP8sIxv/OTIq/1hR
Sv+Dfnn/s6+s/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+s/4N+
ef9YUUr/OTIq/ywjG/8pIBj/KyMa/y8nHv8wJx//MCce/y8mHf8vJh3/LyYc/y8lHP8uJRz/LyUc/y8l
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8lHP8vJRz/LiUc/y8lHP8vJhz/LyYd/y8mHf8vJx7/MCcf/zAo
IP8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wJx//LyYd/y4kGv8sIhf/KyAU/ysfE/8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8qHxL/Kh8S/yof
Ev8qHxL/Kh8S/yofEv8qHxL/KyAT/ywhFf8tIhf/LiQZ/y8lG/8vJRv/KyIY/ykgFv8sIxv/OTIq/1hR
S/+Dfnn/s6+t/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+t/4N+
ef9YUUv/OTIq/ywjG/8pIBb/KyIY/y8lG/8vJRv/LiQZ/y0iF/8sIRX/KyAT/yofEv8qHxL/Kh8S/yof
Ev8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8qHxL/Kh8S/yofEv8rHxP/KyAU/ywiF/8uJBr/LyYd/zAn
H/8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKB//LyYd/y4lGv8uIxf/LSEU/ywgE/8sIBL/LCAS/ywgEv8sIBL/LCAT/ywgE/8sIBP/LCAT/ywg
E/8sIBL/LCAS/ywgEv8sIBL/LSET/y0iFf8uIxf/LyUZ/zAmG/8vJhv/LCIY/ykgFv8sIxv/OjIq/1hR
S/+Dfnn/s6+t/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+t/4N+
ef9YUUv/OjIq/ywjG/8pIBb/LCIY/y8mG/8wJhv/LyUZ/y4jF/8tIhX/LSET/ywgEv8sIBL/LCAS/ywg
Ev8sIBP/LCAT/ywgE/8sIBP/LCAT/ywgEv8sIBL/LCAS/ywgEv8sIBP/LSEU/y4jF/8uJRr/LyYd/zAo
H/8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRn/LCIa/y8m
Hv8wKCD/MCgf/y8nHv8vJh3/LyYd/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHf8vJx3/MCce/zAnH/8vJx7/KyMa/ykgGP8sIxv/OjIq/1hR
Sv+Dfnn/s6+s/9zb2v/39/f////////////5////8vn5//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8vn5//n///////////////f39//c29r/s6+s/4N+
ef9YUUr/OjIq/ywjG/8pIBj/KyMa/y8nHv8wJx//MCce/y8nHf8vJh3/LyYc/y8mHP8vJhz/LyYc/y8m
HP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYc/y8mHP8vJhz/LyYd/y8mHf8vJx7/MCgf/zAo
IP8vJh7/LCIa/ywhGf8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIRj/LCIZ/y8m
Hf8wKCH/Lykj/y4qJ/8uKyr/LSwt/y0sL/8sLDD/LCww/ywsMP8sLC//LCwv/ywsL/8sLC//LCwv/yws
L/8sLC//LCww/ywsMP8sLC//LCwu/ywrLf8sKir/LCko/ywoJv8sJyP/KSMe/ycgGv8rJB3/OTEq/1VP
SP9+eXT/q6il/9PR0P/s7e3/9/r6//n9/f/1+/v/8fj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/w+Pj/8Pj4//D4+P/w+Pj/8fj4//X7+//5/f3/9/r6/+zt7f/T0dD/q6il/355
dP9VT0j/OTEq/yskHf8nIRr/KSMe/ywnI/8tKCb/LCko/ywqKv8sKy3/LCwu/ywsL/8sLDD/LCww/yws
L/8sLC//LCwv/ywsL/8sLC//LCwv/ywsL/8sLDD/LCww/ywsMP8tLC//LSwt/y4rKv8uKif/Lykj/zAo
If8vJh3/LCIZ/ywhGP8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIBf/LSEY/y8m
Hf8vKSP/Lisr/ysuNv8oMUH/JjRL/yU2Uf8kNlT/JDZU/yQ2U/8lNVL/JTVS/yU1Uv8lNVL/JTVS/yU1
Uv8lNlL/JTZT/yU2U/8lNVL/JDRO/yMxSP8iLUD/Iio4/yInMf8jJSv/IiEj/yMgHv8pIx//NzAp/1BK
Q/90bmn/mpeT/728u//W19b/5Obn/+vw8P/u9PT/8Pf3//L6+v/y+/v/8vr6//H5+f/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/x+fn/8vr6//L7+//y+vr/8Pf3/+709P/r8PD/5Obn/9bX1v+9vLv/mpeT/3Ru
af9QSkP/NzAp/yokH/8lIR7/JCMk/yUnK/8lKTH/JCw4/yQvQf8kMkj/JTRO/yU1Uv8lNlP/JTZT/yU1
Uv8lNVL/JTVS/yU1Uv8lNVL/JTVS/yU1Uv8kNlP/JDZU/yQ2VP8lNlH/JjRL/ygxQf8rLjb/Lisr/y8p
I/8vJh3/LSEY/ywgF/8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnH/8sIBb/LSEW/y8l
HP8vKib/Ky41/yc0Sv8iOmD/HT9z/xtDfv8ZRIP/GUOD/xpDgf8aQn//GkJ//xpCf/8aQn//GkJ//xpC
f/8aQoD/GkOB/xpDgf8aQn//GT95/xg5bf8WMl3/FCtN/xQlP/8WIjX/GR8q/x4fI/8mIyH/NC4p/0pD
PP9mYFr/hIB9/6Ggnv+4ubn/y83O/9re3v/l6+z/7vX1//T8/P/1/v7/9Pz8//L6+v/w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+vr/9Pz8//X+/v/0/Pz/7vX1/+Xr7P/a3t7/y83O/7i5uf+hoJ7/hIB9/2Vg
Wv9KQzz/NS8p/yglIv8hIiT/HiMr/xwnNv8aKkH/GS9O/xk1Xv8aO23/Gj95/xpCf/8aQoH/GkKB/xpC
gP8aQn//GkJ//xpCf/8aQn//GkJ//xpCf/8aQ4H/GUOD/xlEg/8bQ37/HT9z/yI6YP8nNEr/Ky41/y8q
Jv8vJRz/LSEW/ywgFv8wJx//PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnHv8sIBX/LSAU/y8l
G/8uKij/KTE//yI5Xv8aQn//FEqb/xBPrf8OUbT/DlG0/w9Qsf8PT6//D06u/w9Orv8PTq7/D06u/w9O
rv8PT6//D1Cx/w9Qsv8PTq//Dkql/w1ClP8KOH3/CS9m/wknUf8NIkH/EyA0/xogKv8lJCX/Mi0o/0M8
Nf9XUEr/bGhk/4OBgP+YmZn/r7Gy/8XKyv/a4OD/6vHx//P7+//2////9f7+//L7+//w+Pj/7/j4/+/3
9//v9/f/7/j4//D4+P/y+/v/9f7+//b////z+/v/6vHx/9rg4P/Fysr/r7Gy/5iZmf+DgYD/bGhk/1ZQ
Sv9CPDX/Mi0o/yclJf8eIyr/GCQ1/xMnQ/8QLFL/DjNn/w47fv8PRJT/D0ul/w9Or/8PULL/D0+x/w9P
r/8PTq7/D06u/w9Orv8PTq7/D06u/w9Pr/8PULH/DlG0/w5RtP8QT63/FEqb/xpCf/8iOV7/KTE//y4q
KP8vJRv/LSAU/ywgFf8wJx7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3COif9TX1n/PDsz/zAnHv8tHxT/LiAT/y8l
G/8uKyv/JzJH/x49bv8USJf/DFG7/wdX0f8FWtv/BVrc/wVa2f8GWdb/BlnW/wZZ1v8GWdb/BlnW/wZZ
1v8GWdf/Blra/wZb2v8GWdb/BlXL/wZNtv8GQpv/Bjd//wkvZv8NKVL/FCZA/xwlMv8mJir/MCwo/zw1
Lv9JQjv/V1NO/2hmZP97fHv/lJaW/7C0tP/L0NH/4ejo/+729v/z+/v/9Pz8//L6+v/w+Pj/8Pj4//D4
+P/w+Pj/8Pj4//D4+P/y+vr/9Pz8//P7+//u9vb/4ejo/8vQ0f+wtLT/lJaW/3t8e/9oZmT/V1NO/0lC
O/88NS7/MCso/yUmKf8bJDL/EiVA/wsoUf8HLWX/BTZ//wVBm/8FTLb/BlXL/wZZ1v8GW9r/Blra/wZZ
1/8GWdb/BlnW/wZZ1v8GWdb/BlnW/wZZ1v8FWtn/BVrc/wVa2/8HV9H/DFG7/xRIl/8ePW7/JzJH/y4r
K/8vJRv/LiAT/y0fFP8wJx7/PDsz/1NfWf9wjon/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eH/jby6/3CNif9TX1n/PDoz/zAnHv8tHxP/LiAS/y8l
Gv8tKyz/JjJK/xw9df8RSKL/CFLK/wJY4/8AXO7/AF7x/wBe7/8BX+3/AV/t/wFf7f8BX+3/AV/t/wFf
7f8AYO//AGDx/wBg8v8AX+7/Alzi/wdXzv8MULT/EkiX/xhBff8dO2b/IjRR/yYvPf8qKy//MCsn/zcw
KP8+NzD/SEM+/1RST/9mZWT/fn9//5uenv+4vb3/0dfX/+Ho6P/q8fH/7vX1//D39//x+Pj/8/r6//T7
+//0+/v/8/r6//H4+P/w9/f/7vX1/+rx8f/h6Oj/0dfX/7i9vf+bnp7/fn9//2ZlZP9VUk//SUM+/0A5
MP84MCj/Lyon/yQnLv8aJTv/DyZN/wcqYv8CL3n/ADmU/wBFsf8AUcz/AVri/wFf7v8BYfL/AWHx/wFg
7/8BX+3/AV/t/wFf7f8BX+3/AV/t/wFf7f8AXu//AF7x/wBc7v8CWOP/CFLK/xFIov8cPXX/JjJK/y0r
LP8vJRr/LiAS/y0fE/8wJx7/PDoz/1NfWf9wjYn/jby6/6Hh4f+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GNiP9TXlf/PDkx/zEmHP8tHhL/Lh8R/zAl
Gv8tKiz/JjFK/xs5df8QQqL/B0vK/wFS5P8AV/H/AFv2/wBe9v8AYPX/AGL2/wBi9/8AYvf/AGL3/wBi
9v8AYfj/AGD5/wBg+v8AX/f/Bl/t/xJh3f8hYsn/MGOx/ztgmf8/WYH/PU1l/zc+Sv8yMTT/Lyol/zEp
If81LSX/PDYv/0ZCP/9VU1H/a2tp/4WHhv+go6P/uL29/8vQ0f/a4OD/5evs/+709P/1+/v/+v////z/
///8////+v////X7+//u9PT/5evs/9rg4P/L0NH/uL29/6Cjo/+FhoX/a2pp/1VTUf9HQz//Pzkw/zoy
Jv82LSL/Lyol/yUnMf8aJ0X/EChc/wcsdv8BMo7/ADyo/wBIwv8AVNr/AF3s/wBi9/8AZPv/AGP6/wBi
+P8AYvf/AGL3/wBi9/8AYvf/AGL2/wBg9f8AXvb/AFv2/wBX8f8BUuT/B0vK/xBCov8bOXX/JjFK/y0q
LP8wJRr/Lh8R/y0eEv8xJhz/PDkx/1NeV/9xjYj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jbu4/3GMh/9UXVb/PTgw/zElG/8uHhH/Lx8R/zAl
Gv8tKiv/Ji5I/xszcP8QOpv/B0DB/wFH2/8ATen/AFTw/wBa8/8AX/X/AGL3/wBj+P8AY/j/AGL3/wBi
9/8AYPj/AF75/wBd+f8AXvf/C2Hx/yBr5/88eNv/VoLL/2eGt/9qfp7/YGp9/05RWf88Ojr/MCok/ywk
G/8tJRz/Mywl/zw3Mf9JRUH/WlhV/25ubP+Fh4b/m56e/7CztP/FyMj/2dzc/+vs7P/4+fn/////////
//////////////j5+f/r7Oz/2dzc/8XIyP+ws7T/m56e/4WHhv9ubmz/WVdV/0lFQf8+OTL/OTEm/zct
Hv80Kh3/Lykk/yYoNf8bKE//ECpt/wcui/8BNKT/AD66/wBJz/8AVeH/AF3v/wBi9/8AZPr/AGP6/wBi
+P8AYvf/AGL3/wBj+P8AY/j/AGL3/wBf9f8AWvP/AFTw/wBN6f8BR9v/B0DB/xA6m/8bM3D/Ji5I/y0q
K/8wJRr/Lx8R/y4eEf8xJRv/PTgw/1RdVv9xjIf/jbu4/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9/v/o/r9/6j19v+h4eD/jby5/3GMiP9UXVf/PTkx/zElHP8uHxL/LiAS/zAl
Gv8tKSr/JitE/xstaP8QMI//BzWy/wE7y/8AQ9v/AEzl/wBW6/8AXfD/AGHz/wBi9f8AYvX/AGH0/wBh
8/8AX/T/AF30/wBc9P8AXvP/D2bw/y537v9Wjur/e6Hi/5Sr1P+Worr/hImV/2dna/9KRUT/NC4o/ywk
G/8qIhn/Lice/zYvKP8/OjT/S0dD/1pYVf9ra2n/fn9//5SWlv+usLD/ysvL/+Pk5P/29vb/////////
//////////////b29v/j5OT/ysvL/66wsP+Ulpb/fn9//2traf9ZWFX/S0dD/z86NP84MSn/NSwg/zQq
G/8zKRz/Likm/yYpPf8bK1z/EC1//wcyoP8BOLj/AEHL/wBL2v8AVeX/AF3u/wBh8/8AYvX/AGL1/wBh
9P8AYfP/AGH0/wBi9P8AYvX/AGHz/wBd8P8AVuv/AEzl/wBD2/8BO8v/BzWy/xAwj/8bLWj/JitE/y0p
Kv8wJRr/LiAS/y4fEv8xJRz/PTkx/1RdV/9xjIj/jby5/6Hh4P+o9fb/o/r9/5f3+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/17g
7/9s5O//eejw/4jv9f+X9vv/o/r9/6j19v+h4uH/jL27/2+Pi/9RYVz/Oj03/y8qIv8sIxf/LSMW/y8m
HP8tKCn/JihA/xwoYP8RKYP/Byyj/wEyu/8AO83/AEba/wBS5P8AW+v/AGDw/wBi8v8AYfL/AGHx/wBg
8P8AYPD/AF/w/wBf8f8GZPH/GW/w/z+G8/9uovX/mrz0/7fI6v+5wNL/o6Ss/4B9f/9bVlT/QDo0/zMr
JP8uJh3/LyYe/zMrJP84MSv/Pzo0/0lFQf9VU1H/ZmVk/3t8e/+YmZn/uLm5/9bX1v/s7e3/+fr5////
////////+fr5/+zt7f/W19b/uLm5/5iZmf97fHv/ZmVk/1VTUf9JRUH/Pzo0/zgxK/8zKyT/MSgf/zEo
Hv8vKCP/LCox/yQrSv8aLmz/DzKR/wY2sv8BPMn/AETY/wBN4v8AVuj/AFzt/wBg8P8AYfL/AGHx/wBg
8f8AYPD/AGHx/wBi8v8AYvL/AGDw/wBb6/8AUuT/AEba/wA7zf8BMrv/Byyj/xEpg/8cKGD/JihA/y0o
Kf8vJhz/LSMW/ywjF/8vKiL/Oj03/1FhXP9vj4v/jL27/6Hi4f+o9fb/o/r9/5f2+/+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9D1Or/UNvu/13g
7/9r5O//eOjw/4fv9f+X9vr/pPr8/6j19v+h4+P/isHA/2uVlP9Mamj/M0dE/ygzL/8mKiL/Kigd/y0p
IP8tKSn/Jic8/xwmWP8RJXf/ByiV/wEtrf8AN8H/AETR/wBQ3/8AWun/AGDw/wBh8v8AYfL/AGDx/wJh
8P8GZPD/C2fx/xNs8f8hdPL/N4Lz/1ya+P+Jtf3/sc7+/8za9v/O0+L/ubnA/5iVl/90b2//WFJP/0dA
Ov88NS3/Ni4m/zQsI/80LCT/NzAp/z04Mv9HQz//VVJP/2hmZP+DgYD/oaCe/728u//T0dD/393c/+Xj
4v/l4+L/393c/9PR0P+9vLv/oaCe/4OBgP9oZmT/VVJP/0dDP/8+OTL/ODEp/zMrJP8vKCL/LSYk/ysn
Kv8qKTX/JixG/x8vYP8WMoH/DTek/wU8wv8BQtb/AEni/wBR6f8AWOz/AF3u/wBg8P8AYfH/AGHx/wBg
8P8AYPD/AGHx/wBi8v8AYvL/AGDw/wBa6f8AUN//AETR/wA3wf8BLa3/ByiV/xEld/8cJlj/Jic8/y0p
Kf8tKSD/Kigd/yYqIv8oMy//M0dE/0xqaP9rlZT/isHA/6Hj4/+o9fb/pPr8/5j2+v+I7/X/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9C1Or/T9vt/1zg
7/9p5O//dujw/4bu9P+X9vn/pPn7/6n19v+g5eX/h8bH/2WeoP9Cdnn/KFVY/x1AQv8dNTL/JC8o/yss
Jf8sKSn/JiY4/xwkT/8RJGr/ByaF/wEsnf8ANrP/AEPI/wBQ2v8AWuf/AGDw/wBh8/8AYPP/AGDx/wVj
8P8RavH/IXTy/zWB8/9Lj/T/ZJ72/4Sz+v+myf//xdv//9jk+//Z3+z/ysvS/7Gvs/+VkpP/fHd2/2hi
Xv9WTkf/Rj40/zsxJv80Kx//Myof/zYuJf89NzD/SEM+/1dTTv9saGT/hIB9/5qXk/+rqKX/tbGu/7m2
s/+5trP/tbGu/6uopf+al5P/hIB9/2xoZP9XU07/SUM+/z85MP85MSb/NSwg/zEoH/8tJiT/KSYv/yUo
Pv8iK1H/HS5m/xczf/8QOJv/Cj63/wREz/8BSt//AE/o/wBV7f8AWu7/AF7v/wBg8P8AYfH/AGHw/wBg
8P8AYPD/AGHx/wBi8/8AYvP/AGDw/wBa5/8AUNr/AEPI/wA2s/8BLJ3/ByaF/xEkav8cJE//JiY4/ywp
Kf8rLCX/JC8o/x01Mv8dQEL/KFVY/0J2ef9knqD/h8bH/6Dl5f+p9fb/pfr8/5n2+f+I7/T/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zXK4v9C1Or/Ttvt/1vg
7/9o4+//defw/4Xu9P+X9fj/pPn7/6n29v+f5+j/g8zP/16pr/84hI3/HWVw/xJQWf8VQkT/Hjc0/ygw
K/8rKin/JiYz/x0kRf8RJFz/ByZ1/wEsjP8ANqX/AEO9/wBQ1P8AWub/AF/w/wBg8/8AX/P/AF/x/wdl
8P8ccfL/OYPz/1mX9f95q/f/k7z5/6zL/P/C2f//0+T//93o/f/e5fP/1trk/8jJ0f+2tbr/op+i/4yH
h/9ya2f/WFBI/0M5Lv82LB//MSca/zIpHf83Lyb/Pzgw/0lCO/9WUEr/ZWBa/3Ruaf9+eXT/hH97/4eC
fv+Hgn7/hH97/355dP90bmn/ZWBa/1ZQSv9JQjv/QDkw/zoyJv83LR7/NCob/zEoHv8rJyr/JSg+/x8q
V/8ZLnL/EzKK/w43oP8KPrb/BkbK/wJM2v8AUub/AFbs/wBa7/8AXO//AF/v/wBg8P8AYfD/AGDw/wBg
8P8AYPD/AGHx/wBi8/8AYvT/AGDw/wBa5v8AUNT/AEO9/wA2pf8BLIz/ByZ1/xEkXP8dJEX/JiYz/ysq
Kf8oMCv/Hjc0/xVCRP8SUFn/HWVw/ziEjf9eqa//g8zP/5/n6P+q9vb/pvn7/5n1+f+J7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/xCYsP8bqcL/KLvU/zbK4v9C1Or/UNvu/13g
7/9q5O//d+jw/4fu8/+Y9Pj/pfj6/6j19v+d6ev/gNLX/1q0vv80lKL/F3iI/w1icP8RUFf/HEFB/yc1
Mf8rLCr/JiYu/x0jO/8RJE7/Bydl/wEtfP8AN5b/AESz/wBQzv8AWuT/AF/w/wBf9P8AXvT/AF/x/wpm
8f8ld/L/S4/0/3Wp9/+cwfn/uNL7/8re/f/V5f7/3On+/97q/f/f6Pj/3eTz/9fd6//N0d7/vsDL/6am
rf+GhIb/ZWBe/0hBO/82LST/LiUb/y4lHP8yKiH/NzAo/zw1Lv9CPDX/SkM8/1BKQ/9VT0j/WFJL/1pT
Tf9aU03/WFJL/1VPSP9QSkP/SkM8/0I8Nf88NS7/ODAo/zYtIv80Kh3/Mykc/y8oI/8qKTX/IitR/xku
cv8RMZL/Cjar/wY9v/8ERc7/Ak3a/wFU4/8AWer/AFzu/wBe8P8AX/D/AF/w/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9P8AYvT/AGDw/wBa5P8AUM7/AESz/wA3lv8BLXz/Bydl/xEkTv8dIzv/JiYu/yss
Kv8nNTH/HEFB/xFQV/8NYnD/F3iI/zOUov9atL7/gNLX/53p6/+o9fb/pfj6/5n0+P+I7vT/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/w+YsP8bqcL/KLvU/zbK4v9E1er/U9zu/2Ph
7/9y5fD/gOnx/43u9P+b9Pf/pff5/6b19v+a6+3/f9jf/1u/y/83pbX/HYye/xN1hf8WX2n/H0tN/yg5
Nv8sLSr/JyYq/x4jMv8UJEL/CihW/wQtbP8BN4n/AESq/wBRyf8AW+L/AF/w/wBf9f8AXfT/AF7y/wpm
8f8oefL/UpP1/4Cv9/+oyfr/xNr7/9Tk/P/c6f3/3ur9/97q/P/e6fz/3un9/9vm/P/T3vb/xM/m/6y0
yf+KkKD/Z2h0/0dGTP8yLzL/KSUm/ygjIv8rJiT/Lion/zArKP8yLSj/NS8p/zcwKf85MSr/OjIq/zoy
Kv86Mir/OjIq/zkxKv83MCn/NS8p/zItKP8wKyj/Lyon/y8qJf8vKST/Likm/ywqMf8mLEb/HS5m/xMy
iv8KNqv/BDzF/wFC1v8ASuD/AFPm/wBZ6v8AXu7/AGDw/wBg8f8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9P8AYvX/AGDw/wBb4v8AUcn/AESq/wE3if8ELWz/CihW/xQkQv8eIzL/JyYq/ywt
Kv8oOTb/H0tN/xZfaf8TdYX/HYye/ziltf9bwMv/f9jf/5rr7f+l9Pb/ovb4/5fz9/+H7fP/eejw/2zk
7/9e4O//UNvu/0PU6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8AgZn/Bomh/w6XsP8ZqcL/JrvT/zTK4v9G1er/Wt3v/2/j
8f+C6PL/kOzz/5rw9f+h9Pf/o/X4/6Dz9f+U6+//ft3l/2PM1/9Ht8f/MqGy/yiKmf8ncHj/KlVX/y4+
Ov8uLSn/KSQk/yEhKf8YIzb/ECdI/wsuX/8HOH7/BESj/wJRxv8BW+L/AGDx/wBg9/8AXvX/AF/y/wlm
8f8kdvL/SY30/3Gm9v+Xvvn/ss/6/8Xb+//T4/z/2+j9/97q/f/e6v7/2Oj//8/i///B2P//r8fz/5at
2f94i7T/WGaL/zxGZv8qMEv/ISY8/x8jNP8hJDH/JCYu/yUmKf8nJST/KSQg/yokHf8sIxr/LSMY/y0j
F/8tIxf/LSMY/ywjGv8qJB3/KSQg/yclJP8lJin/JScu/yUnMf8mKDX/Jik9/yQrSv8fL2D/FzN//w83
oP8HPb//AkLW/wBJ4/8AUOr/AFft/wBd7v8AYPD/AGLx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9v8AYvf/AGHx/wFb4v8CUcb/BESj/wc4fv8LLl//ECdI/xgjNv8hISn/KSQk/y4t
Kf8uPjr/KlVX/ydweP8oipn/MqGy/0i3x/9kzNj/gN7l/5Xr7/+d8vX/m/T3/5Lx9f+F7fP/eejw/23k
7/9f4O//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6V/wB+lf8AgZn/Bomh/w2XsP8WqMH/I7rT/zLJ4f9H1er/Yt7w/37m
8v+W6/T/pu/1/6vy9v+o9Pf/ofP2/5fw9P+M6/D/f+Pq/2/Z4/9fy9f/UrnG/0ihrP9Bgof/O2Bg/zdC
Pv8xLSf/KyIf/yUfIP8fISr/GSc6/xQuUf8POHP/CkWc/wVSxP8CXOP/AGH0/wBh+f8AYPf/AGDz/wdk
8f8acPH/NIDz/1KT9f9wpvb/i7b4/6XH+f++1vv/0eL8/9zp/f/b6P7/zeH//7fV//+exP//hrD2/2+Y
4v9We8X/P16k/yxEhf8eMm3/Fyhc/xYlT/8XJUT/GSU7/xskMf8eIij/IiEg/yYgGf8pHxT/Kh4R/yse
D/8rHg//Kh4R/ykfFP8mIBn/IiEg/x4iKP8bJDH/GiU7/xonRf8aKFD/Gytd/xoubP8WMoH/ETib/ws+
tv8FRc7/AUrg/wBQ6v8AVu7/AFvw/wBe8P8AYfH/AGLx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHz/wBj+P8AY/n/AGH0/wJc4/8FUsT/CkWc/w84c/8ULlH/GSc6/x8hKv8lHyD/KyIf/zEt
J/83Qj7/O2Bg/0GCh/9Ioaz/UrnG/2HL1/9z2eP/g+Tr/4/r8P+T8PT/kvH1/4zv9P+D7PL/eejw/27l
7/9g4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6V/wB+lf8AgZn/BYmh/wyXsP8VqMH/IrrT/zPK4f9M1uv/beDx/5Dp
9P+t7/b/vfP4/731+P+x9Pf/oPH2/5Du8/+G6vD/gejv/37l7f963ub/dNDY/2q3vf9dlJX/Tmxq/z9I
Qv80Lif/LSIb/ykeGf8mISD/Iicv/x0uRv8XOGn/D0WV/wlSwP8DXOL/AGH0/wBi+v8AYfj/AGDz/wRj
8f8OafH/HHLx/y588/9DifT/W5n1/32u9/+ixfn/wtn7/9Xl/P/T5P3/vNf+/5rC/v90qvv/VpP0/0B+
5v8waNP/I1O8/xlBpv8SNJL/Dix//wwobf8NJ1z/DyZN/xMkP/8YIzP/HyIn/yYiHv8rIRf/LSET/y8h
Ef8vIRH/LSET/yshF/8mIh7/HyIn/xgjM/8TJD//DyZN/w4oXf8PKm7/Dy1//w8ykf8NN6T/Cj63/wZG
yv8DTdr/AVPm/wBX7f8AW/D/AF3w/wBf8P8AYfH/AGHx/wBh8f8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHz/wBj+P8AY/r/AGL0/wNc4v8JUsD/D0WV/xc4af8dLkb/Iicv/yYhIP8pHhn/LSIb/zQu
J/8/SEL/TWxq/1yTlf9qt73/ddDY/33e5v+C5u3/hunw/4jr8f+I7fL/h+3z/4Tt8v9/6/H/eOjw/27l
7/9h4e//Utzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/Bomh/w6XsP8YqcL/JrvU/zrL4v9W2Oz/e+Py/6Ls
9v/B8vj/0fb6/833+f+69Pj/ovD1/47s8/+F6/H/hu3z/43v9f+T7vL/k+Pm/4jKzP90pKP/XHh0/0VP
Sf81Miz/LSQc/ysgFv8rIhr/Kicm/yYtPP8eN2D/FUSM/wtQuP8EWtz/AGDv/wBh9v8AYfb/AGDy/wJh
8P8EY/D/B2Xw/w5o8f8acPL/MH7z/1aW9f+Fs/j/r836/8jc/P/F2/z/p8n7/3yu+f9Okfb/K3jw/xhm
6P8PV93/C0rR/wk/wv8HN7L/BTGf/wQti/8FK3X/Byli/wsoUv8TJ0P/HCc2/yUnLP8sJyT/MCcf/zEn
HP8xJxz/MCcf/ywnJP8lJyz/HCc2/xMnQ/8LKFL/Bypi/wUsdv8FLov/BjKg/wY2sv8FPML/BETP/wNM
2v8BVOP/AFnq/wBd7v8AXvD/AF/w/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGHy/wBi9v8AYvb/AGDv/wRa3P8LULj/FUSM/x43YP8mLTz/Kicm/ysiGv8rIBb/LSQc/zUy
LP9FT0n/XHh0/3Sko/+Iysz/k+Pm/5Tu8v+Q8PX/ie3z/4Lq8f9/6vH/furx/33q8f966fD/defw/2zk
7/9g4e//Udzu/0PV6v82yuL/KLvU/xupwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH2V/wB9lf8BgZn/CImh/xOZsP8iq8P/NL7V/0rP5P9n3O7/jOb0/7Hv
+P/P9fr/3vj7/9j4+v/D9fj/qvH1/5Xt8/+M7PP/kfH2/5v3+/+k+Pr/pe/w/5jX1/9/sK//YYOB/0VZ
Vv8yOzb/Kisk/yklGv8sJRr/Ligi/yotNP8iNVb/GECA/w1Mq/8FVc7/AFvj/wBe7f8AX+//AF/v/wBg
7/8AX/D/AF7w/wBe8P8DYvD/Fm7x/zuF8/9rovb/lr35/7DO+v+tzPr/j7r5/2Ke9/8zgfT/EWnv/wFa
6/8AT+b/AEff/wBC1v8BPMn/ADi4/wA0o/8AMY3/ATB5/wYuaP8OLln/GC5N/yEuQv8oLjr/LC41/y4u
M/8uLjP/LC41/yguOv8hLkL/GC5N/w4uWf8GLmj/ATB5/wAyjf8ANKP/ADi4/wE8yf8BQtb/AUrf/wBS
5v8AWer/AF7u/wBg8P8AYfH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg
8P8AYO//AF/v/wBf7/8AXu3/AFvj/wVVzv8NTKv/GECA/yI1Vv8qLTT/Ligi/ywlGv8pJRr/Kisk/zI7
Nv9FWVb/YoOB/4Cwr/+Z19f/pe/w/6P4+v+Z9vr/i/D2/3/q8f946PD/dufw/3Xn8P9z5u//b+Xv/2fi
7/9c3+//T9vt/0LU6v81yuL/KbvU/xyqwv8QmLD/Bomh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyU/wB8lP8Bf5f/DImg/x6asP80rsT/TcTX/2fV5/+D4vH/ouv3/8Hy
+v/Z9/v/5Pn8/9/5+//O9vn/uPL3/6Xv9f+e8PX/ofX5/6n7/f+v/f7/rfX1/53e3v9/ubn/XY6P/z1m
Z/8oSEn/ITY0/yMtJv8pKiD/Lioi/ywsL/8kMkv/GTpw/w5El/8FTLj/AFLN/wBX2/8AW+T/AF7q/wBg
7v8AX/H/AFzx/wBa8f8AXPD/DmXx/y158v9TkfX/dqj3/4y2+P+Jtfj/cKX3/0yO9f8mdfL/C2Lw/wBW
7f8AT+v/AEvo/wBH4v8ARNj/AEDK/wA+uP8AO6b/ADqV/wQ4hv8LOHr/Ezhv/xo4Zv8gOGD/Izhb/yQ4
Wf8kOFn/Izhb/yA4YP8aOGb/Ezhv/ws4ev8EOIb/ADqV/wA7pv8APbj/AEDK/wBE2P8ASeL/AE/o/wBW
7P8AXO7/AGDw/wBi8f8AYvH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYfH/AGHy/wBh
8f8AYO7/AF7q/wBb5P8AV9v/AFLN/wVMuP8ORJf/GTpw/yQyS/8sLC//Lioi/ykqIP8jLSb/ITY0/yhI
Sf8+Zmf/X4+P/4K6uv+f397/rPX1/6r8/f+d+fz/jPH3/33q8f915/D/cOXv/2zk7v9p4+7/ZeHu/13f
7f9V3e7/S9nt/0HU6v82yuL/KrzU/x2qwv8QmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8Bfpb/EYig/yqbsf9Ks8b/a8rb/4nd6/+j6vX/u/H6/9D2
/P/f+Pz/5/r8/+P5/P/Y9/r/yfX5/7zz9/+18/f/tfj7/7f9/v+3/v7/r/b2/5rh4v95wMP/U5qf/zF0
fP8cWF//FkVJ/xs4Nv8kMSr/LC0m/ywsLf8lLkH/GjNe/w46f/8FQZz/AEiz/wBPxv8AVtb/AFvj/wBf
7f8AYPL/AF7z/wBc8v8AXPD/CmLw/x9v8f85gfP/UZH1/2Cb9f9emvX/TY/1/zR+8/8abfH/B2Dw/wBY
7v8AU+3/AFHs/wBP6P8ATeL/AEvY/wBJzP8AR7//AEaz/wNFqf8HRaD/DUWY/xJFkv8WRY3/GEWK/xlF
if8ZRYn/GEWK/xZFjf8SRZL/DUWY/wdFoP8DRan/AEaz/wBHv/8ASMz/AEvY/wBN4v8AUen/AFXt/wBa
7/8AXvD/AGDx/wBh8f8AYfH/AGHx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfL/AGLz/wBi
8v8AYO3/AFvj/wBV1v8AT8b/AEiz/wVBnP8OOn//GjNe/yUuQf8sLC3/LC0m/yQxKv8bODb/FkVJ/xxY
X/8zdXz/V5qg/37BxP+e4uP/rfb2/6z8/f+f+fz/jfH2/33q8f9y5u//auPu/2Th7f9e3u3/WNzs/1La
7P9M2e3/Rtft/z/T6v82y+L/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8Cfpf/FYqh/zefs/9guMn/idLe/6zl7//D8fj/0/f8/975
/f/k+fz/5/n8/+b5/P/h+fv/2vj7/9P3+v/M9/r/yfr8/8X9/v+9/f3/r/X2/5bj5f9zx83/TKWv/ymF
kv8Tanj/DlZg/xVFSf8gOTb/KjAr/ysrK/8kKjf/GixN/w4wZv8FNoD/AD2X/wBGr/8AUMf/AFjc/wBe
6/8AYfL/AGD0/wBf8/8AXvH/BWHw/xFp8f8fcvL/LHvy/zSA8/8zf/P/Knny/xxx8v8OZ/H/BGDw/wBc
7/8AWe//AFju/wBX7P8AVuj/AFTj/wBT3P8AUtX/AFLP/wJRyf8EUcT/B1HA/wpRvf8MUbr/DVG5/w1R
uP8NUbj/DVG5/wxRuv8KUb3/B1HA/wRRxP8CUcn/AFLP/wBS1f8AU9z/AFTj/wBW6P8AWOz/AFru/wBc
7/8AX/D/AGDw/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfP/AGL0/wBi
8v8AX+v/AFjc/wBPx/8ARq//AD2X/wU2gP8OMGb/GixN/yQqN/8rKyv/KjAr/yA5Nv8VRUn/DlZg/xNq
eP8rhZL/UKaw/3jHzf+Z5Ob/qvX1/6r6+/+e9/r/jvH2/33q8f9x5e//ZuHu/1ze7P9T2uv/S9fq/0bW
6v9D1uz/QNXs/zzS6f81yuL/K7zU/x6qwv8RmLD/B4mh/wGBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB/l/8HhJv/H5Cm/0WmuP90v83/otni/8fs8v/b9/v/5fv+/+f7
/v/n+v3/5/n8/+j6/P/o+vz/6Pr8/+X6/P/f+vz/2fz9/9D+/v/E/Pz/svX2/5fl6f9zztb/TLK//yqW
p/8UfY//D2d1/xVTWv8gQUH/KTQw/ysqKv8kJi//GiY9/w8pUf8GLmf/ATR+/wA+m/8ASrn/AFTU/wBc
5/8AYPH/AGH0/wBg8/8AYPH/AmHw/wZj8P8KZvH/D2nx/xJr8f8Ra/H/Dmnx/wpm8f8FY/D/AWHw/wBf
8P8AXu//AF3v/wBd7v8AXO3/AFzr/wBc6f8AW+b/AFvk/wFb4/8BW+H/Alvg/wNb3/8EW97/BFvd/wVb
3f8FW93/BFvd/wRb3v8DW9//Alvg/wFb4f8BW+P/AFvk/wBb5v8AXOn/AFzr/wBc7f8AXe7/AF7v/wBf
7/8AX/D/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYfP/AGH0/wBg
8f8AXOf/AFTU/wBKuf8APpv/ATR+/wYuZ/8PKVH/GiY9/yQmL/8rKir/KTQw/yBBQf8VU1r/D2d1/xR9
j/8rlqf/TrK//3TO1v+V5ej/pfP0/6b3+f+c9fj/jfD1/33q8f9w5e//Y+Dt/1bb7P9K1+r/QdPp/zzS
6f860+r/OdPr/zjQ6P8yyeH/KbvU/x2qwv8QmLD/Bomh/wCBmf8AfZX/AH2V/wB/l/8AgJj/AICY/wCA
mP8Afpf/AH+X/wOBmf8Fgpr/CYSb/xGIn/8gkKX/Op2w/2Cxwf+MydT/tt/m/9fw9f/o+fz/7fz//+z8
/v/p+v3/6Pn8/+r6/P/s+v3/7vv9/+78/f/q/P3/4/39/9r+/v/M/Pz/uvb3/6Hp7f9/19//WsHO/zqp
uv8lkqT/HXqI/x9haP8mSUr/LDYy/yspJ/8lIyf/HSIw/xMkQP8LKVP/Bi9s/wQ5i/8CRK3/AU/N/wBX
4/8AXO//AF7z/wBf8v8AX/D/AF/w/wBf8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg8f8AYPH/AGDx/wBg
8f8AYPH/AGDx/wBg8f8AYPH/AGDx/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8f8AYPH/AGDx/wBg8f8AX/P/AF70/wBc
7/8AV+P/AU/M/wJErf8EOYv/Bi9r/wspU/8TJED/HCIw/yUjJ/8rKSf/LDYy/ydKSv8gYWj/HnqI/ySS
o/84qbr/VsDN/3bW3v+R5+v/n/L0/6D19/+Y8/f/i+/0/33p8f9w5e//YuDt/1Pa6/9G1er/PNHo/zbQ
6P8z0On/MtDp/zDN5v8sxt//I7nS/xmowf8Ol6//BYmh/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8Ae5T/AH2V/waAmP8Rhp3/H42j/zGXq/9Ho7T/YbHA/4LCzv+l1N3/xubs/97z9v/r+vz/7/z+/+z7
/v/p+v3/6Pn8/+r6/P/u+/3/8fz9//H8/f/v/f3/6f3+/+L+/v/W/Pz/x/j4/7Hu8v+U4un/dNLd/1e/
zf9Cqrj/No+a/zJwdf8wUVD/Lzcy/ywnIv8mHx7/IB4k/xkhMf8UJ0T/Dyxc/wo1fv8GP6P/A0nG/wFQ
4P8AVe3/AFjy/wBa8v8AW/D/AFzw/wBc8P8AXPD/AFzw/wBb8P8AXPD/AF3w/wBe8P8AX/D/AGDw/wBg
8P8AYfD/AGHx/wBh8f8AYfH/AGLy/wBi8/8AYvT/AGL1/wBi9f8AYvb/AGL2/wBi9/8AYvf/AGL3/wBi
9/8AYvf/AGL3/wBi9/8AYvf/AGL2/wBi9v8AYvX/AGL1/wBi9P8AYvP/AGLy/wBh8f8AYfH/AGHx/wBh
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHx/wBh8v8AYfP/AGHz/wBf8/8AXfT/AFr0/wBW
7v8BUOD/A0jG/wY/o/8KNX7/Dyxc/xQnRP8ZITH/IB4k/yYfHv8sJyL/MDcy/zJRUP80cHX/OY+a/0Gp
uP9Rvsz/ZtDb/3ze5v+N6O7/lu/z/5fy9f+R8fX/h+7z/3zp8f9x5e//Y+Dt/1Pa7P9F1er/OdDo/zLO
5/8tzef/Kszn/yfJ5P8iwtz/G7XQ/xKlv/8Lla7/BIih/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeJH/AHuU/wqBmf8di6H/N5ms/1Wpuf90ucb/jsfR/6fU3f++4ef/0uzx/+H0+P/p+fz/6/r9/+r6
/f/o+fz/6Pn8/+r6/P/t+/3/8Pz9//H8/f/w/P3/7f3+/+j9/v/g/P3/1Pn6/8P09v+t7fL/k+Pr/3vV
3v9mwcv/VqSr/0l/gf8+WVf/NTk0/y0lH/8oHRj/JB0b/yEhJv8dJjf/GCtP/xIycv8MOpr/BkG//wJI
2v8ATen/AFLv/wBW8P8AWe//AFvw/wBc8P8AXPD/AFzw/wBc8P8AXPD/AF3w/wBe8P8AX/D/AGDw/wBg
8P8AYfD/AGHw/wBh8f8AYfH/AGHy/wBh8/8AYvP/AGL0/wBi9f8AYvX/AGL1/wBi9v8AYvb/AGL2/wBi
9v8AYvb/AGL2/wBi9v8AYvb/AGL1/wBi9f8AYvX/AGL0/wBi8/8AYfP/AGHy/wBh8f8AYfH/AGHw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPH/AGHy/wBi8/8AYvT/AGH0/wBe9P8AWvT/AFXx/wBP
6v8CSNr/BkG//ww5mv8SMnL/GCtP/x0mN/8hISb/JB0b/ygdGP8tJR//NTk0/0BaV/9NgIL/WaSr/2XB
yv9v093/et/o/4Pm7f+J6vD/jO3y/4zv9P+J7vP/g+zy/3vp8f9x5e//ZOHu/1Xb7P9G1er/OdDo/zDN
5/8oy+b/Isnk/xzE4f8Wvdn/EbHN/wuivf8GlK3/A4ig/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeZL/AH2W/w6FnP8pk6f/TqW2/3e6x/+dztf/t9zi/8jl6v/T7PD/2/H1/+D1+f/l+Pv/5/n8/+f5
/P/n+fz/5/n8/+n6/P/s+/3/7vv9/+/8/f/v/P3/7v39/+39/f/p/P3/4fv7/9X4+v/F9vn/svL2/57p
7f+K19v/dri6/2GPj/9NZWH/PEA6/zAqI/8rIBj/KR8X/ygjH/8mJy7/IStF/xkvZ/8QNY7/CDq0/wJA
0P8AR+H/AE3p/wBU7P8AWe7/AF3v/wBf8f8AX/H/AF/w/wBf8P8AX/D/AF/w/wBf8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBh8f8AYfH/AGHx/wBh8v8AYfL/AGHy/wBh8v8AYfL/AGHy/wBh
8v8AYfL/AGHy/wBh8v8AYfL/AGHy/wBh8v8AYfL/AGHx/wBh8f8AYfH/AGDx/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHx/wBi8v8AYvL/AGDx/wBc7/8AVu7/AE/q/wBH
4f8CQdD/CDq0/xA1jv8ZL2f/IStF/yYnLv8oIx//KR8X/ysgGP8wKiP/PUA6/09lYf9lkI//eLi7/4bW
2/+M5uv/jOzy/4ns8/+F6/H/g+vx/4Hr8v+A6/L/furx/3no8P9w5e//ZOHu/1bb7P9H1ur/OtDo/y7M
5v8kyeT/GsXi/xLA3v8Mudb/B63K/wSgu/8Dkqz/AYeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8CgZn/C4Wc/x2Oo/88nrD/ZbLA/5PJ0v+73eP/1Oru/9/x9P/i9Pf/4fX4/+H1+f/i9/r/5Pj7/+X4
/P/m+fz/5/n8/+n6/P/r+vz/7Pv9/+77/f/u/P3/7/z9//D8/f/u/P3/6vz8/+L7/f/X/f7/yv3+/7r3
+P+n5+j/kMnJ/3agnv9cdXH/RU9J/zY3MP8wKiH/LiYb/y4nHv8tKSj/Jyo7/x4sWv8UMH//DDSj/wY7
wP8EQ9L/Bk3e/wlY5f8LYer/DGbv/wpn8f8HZvH/BGPx/wFh8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYO//AGDu/wBg7f8AX+v/AFzn/wBX4/8AUOD/AEja/wJB
0P8FOr//DDWk/xUwgP8fLVv/Jyo7/y0pKP8uJx7/LiYb/zAqIf82NzD/RU9J/111cf94oZ7/j8nJ/57m
5/+g8/b/mfX5/47x9v+D6/L/fOnw/3no8P946PD/d+jw/3Tm7/9s5O//YeDt/1Tb7P9H1ur/OtDo/y3M
5v8hyOT/FcPh/wu93P8EtdT/AarI/wCduv8Akav/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8olKj/MZir/0Cgsv9crr3/gsDM/6rV3P/O5+r/4vHz/+n2+P/p9/n/5fb5/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+n6/P/q+vz/6/v9/+z7/f/u+/3/7/z9//H8/f/x/P3/7/z9/+r9/v/k////2////8/+
/v++8vH/ptjW/4m0sv9sjYr/Umpm/0BRS/84QDj/NDUp/zMuIv8wKiT/Kicw/yEmSf8XKGj/EC2I/w01
o/8QQbj/GVLK/yJj2f8qceX/K3jt/yR28f8acPL/D2jx/wVi8P8AX/D/AF7x/wBf8f8AYPH/AGHy/wBh
8v8AYfH/AGHx/wBh8f8AYfH/AGHw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGHw/wBh8f8AYfH/AGHx/wBh
8f8AYfL/AGHy/wBh8v8AYfP/AGHz/wBh8v8AX+//AF7q/wBb4/8AWNz/AFTU/wFPzP8DSMb/BUG//wg6
tP8MNaT/EjCK/xorav8jKEr/Kygx/zAqJP8zLiL/NTUp/zhAOP9AUUv/UGpm/2mNiv+EtLH/nNfW/6rv
7/+q+fv/n/n8/5Dz+P+B7PP/eOjw/3Pm7/9w5e//buTv/2vj7v9k4O7/W93t/1DZ6/9E1er/OdDo/y3M
5f8gx+P/E8Lg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP9gsL7/ZrPB/3G4xf+Gws3/odDY/77f5P/Y7O//5vP1/+v3+P/p9/n/5fb6/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+j5/P/p+vz/6vr8/+v7/f/s+/3/7vv9//D7/f/x/P3/8Pz9/+79/v/s////6P///9//
///R9/f/uuTj/5zJyP99q6r/YY2M/010cv9CXlj/O0lA/zY4Lf8xKyP/KiMm/yEfNP8ZIEv/FCVk/xUv
ff8gQZb/Mlqw/0Z0yf9TiN3/VZDr/0mM8v80f/P/HXDy/wpj8f8AXfH/AFzy/wBd8/8AYPT/AGH0/wBi
9P8AYvT/AGLz/wBi8v8AYvL/AGHx/wBh8f8AYfD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBh8P8AYfH/AGHx/wBi8v8AYvL/AGLz/wBi
8/8AYvT/AGL0/wBi9v8AY/j/AGP4/wBi9v8AX+//AFvk/wBV1v8AT8f/AUq5/wNErf8HP6P/Czma/xA1
jv8VMID/Gitq/yAmUP8mIzj/LCQn/zIrI/83OC3/PElA/0JdWP9NdHL/XY2M/3Sqqf+OyMf/o+Lh/670
8/+t+/v/ofn8/5Hz9/+B7PL/dufw/27l7/9p4u7/ZOHt/1/e7f9Y3Oz/Udnr/0nX6/9B0+n/ONDo/y3M
5f8gx+P/FMLg/wm82/8Cs9P/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP+Xy9T/m83W/6HQ2P+t1t3/vd7j/87m6v/d7vD/5fP0/+f19//m9vj/4/b5/+L2+v/i9vr/4/f7/+T4
+//m+Pz/5/n8/+j5/P/o+vz/6fr8/+n6/P/q+vz/7Pv9/+77/f/v+/3/8Pz9//D9/v/w////7////+r/
///e+vr/ye7u/6zd3v+Oycv/cbK1/1ybnP9Nfn3/QmBb/zpEPP8zLif/KyEg/yMbJP8dGzH/GyFD/yEt
Wf8zRHX/UGWW/2yHuf+Bodb/g6vq/3Cj8v9QkPT/LXny/xBm8f8BXfH/AFvy/wBc8/8AX/T/AGH0/wBi
9P8AYvT/AGLz/wBi8v8AYvL/AGHx/wBh8f8AYfH/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBh8f8AYfH/AGHx/wBi8v8AYvL/AGLz/wBi
9P8AYvT/AGL1/wBi9/8AY/n/AGP6/wBi9v8AXu3/AFfb/wBPxv8ARq//AT6b/wU5i/8LNX7/EjJy/xkv
Z/8fLVv/IyhK/yYjOP8pICj/LSMh/zMvJ/86RDz/Q2Bb/05+ff9bmpz/a7K0/3/Iyv+U29z/pevr/671
9f+r+fr/oPf5/5Hx9v+B6/L/defw/2vj7v9h4O3/Wd3s/1La6/9L1+r/R9bq/0LU6v8+0un/N8/n/y3M
5f8hx+P/FMLg/wm82/8CtNP/AKnH/wCcuf8AkKv/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP++3+T/v9/l/8Ph5v/I4+j/z+fr/9fr7v/e7vH/4vHz/+Pz9f/i9Pf/4vX4/+H2+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/o+fz/6Pn8/+j5/P/p+vz/6vr8/+z7/f/u+/3/7/z9//D9/f/y/v7/8v///+/+
/v/l+/v/0fX2/7fu8P+b4+f/gNPY/2q9wf9ZnZ//S3h2/z9UT/82ODL/Ligj/ygfHv8lHiP/JyUv/zEz
Qv9KTV7/bXOF/5Garf+puNH/q8Po/5K48v9ooPX/O4Ty/xVt8P8BYfD/AFzw/wBc8P8AXvD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBh8f8AYfT/AGL0/wBg7/8AW+P/AFLN/wBIs/8APZf/ATR+/wYva/8OLFz/GCtP/yEr
Rf8nKjv/Kygx/ywkJ/8tIyH/MCkj/zY4Mv9AVVD/TXh2/1udn/9pvcH/eNLX/4jh5f+Y6+7/pPHy/6r1
9v+n9vf/nfT3/5Dw9P+B6/L/dOfw/2ji7v9c3uz/UNnr/0fW6v9B0+n/PtLp/zzS6f870en/Ns/n/y3M
5v8hyOP/FcPg/wm82/8CtNP/AKnH/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP/E4ub/xeLn/8jj6P/M5ur/0ujs/9jr7v/e7vH/4fHz/+Ly9f/i9Pf/4fX4/+H2+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6vr8/+z7/f/t+/3/7vz9/+/8/f/v/f3/7/39/+v8
/f/h+vz/0fn7/7v3+/+j8/j/i+ju/3jV2v9mtbn/VY+Q/0hpZ/8+TEb/ODo0/zQxK/81MCr/OzYx/0hE
Qf9iXlz/h4OC/6yqq//FyM//xtPm/63I8f+DsPT/VJPy/yx67/8Ua+3/CWPq/wRf5/8CXeT/AVvj/wBa
4/8AWeX/AFrn/wBa6f8AW+v/AFzs/wBd7v8AXu//AF/w/wBg8P8AYPH/AGDx/wBg8P8AYPD/AGDw/wBg
8P8AYPD/AGDw/wBg8P8AYPD/AGDx/wBg8f8AYPD/AF/w/wBe7/8AXe7/AFzs/wBb6/8AWun/AFrn/wBa
5v8AWuT/AFvi/wFb4v8CXOP/A1zi/wRa3P8FVc7/BEy4/wNBnP8ENoD/Bi5n/wspU/8UJ0T/HSY3/yYn
Lv8tKSj/MCok/zIrI/8zLyf/Njgy/z1LRv9Jamf/WJCQ/2i2uf921dr/g+ju/5Dx9v+b9fj/ovX3/6X1
9v+i9Pb/mfL1/43u8/+A6vH/dObw/2bh7v9Y3Oz/S9fq/0DT6f860ej/ONDo/znQ6P850Oj/Ns/n/y3M
5v8iyOP/FcPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP+m0tr/qNTb/67X3v+32+H/xOHm/9Ho7P/d7vH/5PL0/+b09v/l9fj/4/X5/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6/r8/+77/f/w/P3/8Pz9/+78/f/q+/z/5Pr8/9z5
+//S+Pr/xfn8/7b6/v+m+f7/lfP4/4Xk6f90ycz/Yqep/1OGhf9Ja2n/RlxX/0dUTf9OUkr/WVdO/2hj
Wf+BeW//oZmP/8C6s//V09H/1tzl/8HT7/+ev/L/dabw/1GP7P84fuf/JW/f/xdi1v8MWM7/BFHK/wBN
y/8ATND/AE3X/wBP3v8AUuT/AFXo/wBY7P8AXO//AF/y/wBh9P8AYvT/AGL0/wBh9P8AYfT/AGH0/wBh
9P8AYfT/AGH0/wBh9P8AYfT/AGL0/wBi9P8AYfT/AF/y/wBc7/8AWOz/AFXo/wBS5P8AUN//AFDa/wBQ
1P8AUM7/AVHJ/wNRxv8GUsT/CVLA/wtQuP8NTKv/DUSX/w06f/8NMGb/DylR/xMkQP8ZITH/ISEm/ygj
H/8uJx7/My4i/zc4Lf86RDz/QFVQ/0lqZ/9XiIf/Z6mr/3bKzv+E5On/jvL4/5b4/f+b+Pz/nfX4/53z
9v+a8vX/k/D0/4rt8v+A6vH/dOfw/2bh7v9X3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6P850Oj/Ns/o/y7M
5v8iyOT/FcPg/wq82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP9yucX/d7vI/4HAzP+TydP/qtXc/8Th5v/a7e//5vP1/+r2+P/o9/n/5fb5/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/7Pr9//D8/f/z/f3/8v39/+z8/f/h+vv/1Pf6/8b1
+P+69Pj/svX5/6v4/P+l+f7/nfb7/5Ls8P+C2Nz/cb/C/2GmqP9YkpP/WIaF/2CAff9tf3n/fYJ6/46K
gf+impH/ubGn/8/IwP/d2tb/3uDl/9Db7P+4zu//m7zt/36o6f9kleD/SX/S/y9owf8YU7L/CESr/wA9
rP8APLb/AD7C/wBC0P8ARtr/AEzi/wBS6f8AWe//AF70/wBi9/8AY/j/AGP4/wBi+P8AYvf/AGL3/wBi
9/8AYvf/AGL3/wBi9/8AYvj/AGP4/wBj+P8AYvf/AF70/wBZ7/8AUun/AEzi/wBG2v8ARNH/AEPI/wBD
vf8ARLP/AkSq/wVEo/8LRZz/EEWV/xVEjP8YQID/GTpw/xkzXv8ZLE3/GiY9/x0iMP8gHiT/JB0b/ykf
F/8uJhv/NTUp/zxJQP9DYFv/TXh2/1iQkP9nqav/d8PG/4ba3v+R7PD/mPb6/5r5/f+Z9/v/lvP3/5Pw
9P+P7/P/i+7y/4bs8v9+6vH/defw/2fi7v9Y3Oz/Sdbq/z3S6f830Oj/Ns/o/zjQ6f850en/N9Do/y/N
5v8jyeT/FsPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP85nK//QKCy/0+nuP9ptML/i8XP/7HY3//S6ez/5PL0/+r3+P/p9/r/5ff6/+L2+v/i9/r/4/f7/+X4
+//m+fz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/7Pr9//H8/f/z/f3/8Pz9/+b7/P/V+Pr/wfT4/67x
9v+h8PX/nfH2/570+P+h9vr/ovb5/53x8/+Q5ef/f9XZ/3HGyf9pubz/bbK0/3qurv+Mrav/oa6r/7Kz
rv/Bu7b/z8jC/9rV0P/h39z/4uLk/9zh6f/Q2+z/wNHr/6vC5f+Qrdn/bZDF/0dwrf8lUpn/CzyO/wAx
kP8ALpz/ADCt/wA1v/8AO83/AELY/wBM4v8AVev/AF3x/wBh9v8AY/f/AGP3/wBi9/8AYvb/AGL2/wBi
9v8AYvb/AGL2/wBi9v8AYvf/AGP3/wBj9/8AYfb/AF3x/wBV6/8AS+L/AELY/wA7zf8AN8H/ADaz/wA2
pf8AN5b/AjeJ/wg4fv8POHP/Fzhp/x43YP8iNVb/JDJL/yQuQf8kKjf/JCYv/yUjJ/8mHx7/KB0Y/ysg
GP8wKiH/OEA4/0JdWP9Ofn3/W52f/2i2uf92ys7/htre/5Pn6v+c8fP/n/b5/5z2+v+W8/j/jvD1/4jt
8/+F7PL/g+vx/4Dr8f986fH/dOfw/2ji7v9Z3Oz/Stfq/z7S6f840Oj/N9Do/zjQ6f850en/N8/o/y/N
5v8jyOT/FcPg/wq92/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8LhZz/FIqg/yaTp/9EorP/bbbD/5rN1f/C4eb/2u3w/+Pz9f/l9fj/4/X5/+H1+f/i9/r/4/f7/+X4
+//m+Pz/5/n8/+f5/P/n+fz/5/n8/+f5/P/o+fz/6vr8/+37/f/t+/3/5/r8/9r4+//F9fj/rvH2/5nt
9P+M7PL/i+3z/5Lw9P+c8/b/o/T2/6Pz9f+a7vD/jOfq/4Hf5P972d7/gtXa/5PT1/+p0tT/v9PT/9DU
0//a19X/4NvZ/+Pf3v/k4+L/4+Tl/+Tl6P/i5er/3OHp/87W4/+0wdX/jKG9/157ov8zV4r/Ej18/wIu
ff8AKYn/ACma/wAtrf8BMrv/ATrI/wFF1P8BUN7/AVnm/wFe6/8BYO3/AWDt/wFf7P8BX+v/AV/r/wFf
6/8BX+v/AV/r/wFf6/8BX+z/AWDt/wFg7f8BXuv/AVnm/wFQ3v8BRdT/ATrI/wEyu/8BLa3/ACyd/wAs
jP8BLXz/BC1s/wsuX/8ULlH/HS5G/yYtPP8qLTT/LCwv/ywsLf8rKyv/Kyoq/yspJ/8sJyL/LSUf/zAq
I/82NzD/QFFL/010cv9bmpz/ab3B/3bV2v+E5On/kezw/5zx8/+j8/X/o/T2/5zz9v+S8PT/iO3z/4Dq
8f986fH/e+nw/3rp8P946PD/ceXv/2bh7v9Y3Oz/Stfq/z/S6f840Oj/N9Do/zfQ6P830Oj/NM7n/yzM
5f8hyOP/FMPg/wm82/8CtNP/AKnI/wCduf8AkKv/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8Ae5T/AH+X/w+Hnv8slqr/VKm5/3+/y/+o09v/weHm/9Dp7v/Y7/P/3fL2/+D1+f/j9/v/5fj7/+X4
/P/m+Pz/5vn8/+f5/P/o+fz/6Pn8/+j5/P/m+fz/5Pn8/+H4+//c9/v/0/b6/8Xz+P+y8Pb/nO30/4rr
8v+A6vH/gevx/4ru8/+W8fT/oPT2/6T09v+f8/b/mPH1/5Hu9P+Q7PL/mevw/6rq7v+/6ez/1Onq/+Lp
6P/p6Of/6ujn/+nn5v/m5+b/5ufm/+np5//s6+n/6+ro/+Li4v/Lz9T/prC+/3qMpP9PaYz/Lk59/xs8
e/8RMoH/DC2M/wormf8ILaT/BjOv/wY+uv8GScT/B1LM/wdX0f8HWdP/B1nT/wdY0v8HWNL/B1jS/wdY
0v8HWNL/B1jS/wdY0v8HWNL/B1nT/wdZ0/8HV9H/B1LM/wdJxf8HP7v/BzSw/wcso/8HKJX/BiaF/wYm
df8HJ2X/CihW/xAnSP8ZJzr/Iicv/yonJv8uKCL/Lioi/ywtJv8qMCv/KTQw/yw2Mv8wNzL/NTk0/z1A
Ov9FT0n/UGpm/12NjP9rsrT/eNLX/4Po7v+O8vj/mPb6/5/2+f+j9Pb/ofT2/5nx9f+O7vP/g+vy/3vp
8P925/D/dOfw/3Pm7/9w5e//auPu/2Df7f9U2+z/SNbq/z7S6f840Oj/Nc/n/zTO5/8yzeb/Lszl/yfJ
5P8cxuL/EsHf/wi82/8CtNP/AKnI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AeJH/AHuU/wuCmv8hjqP/P52v/2Cuvf+BwMv/m87X/7Ha4f/E5Or/1O3y/+D0+P/n+Pv/6fn8/+j5
/P/m+Pz/5vj7/+f5/P/q+vz/7Pr9/+v6/f/m+fz/3ff7/9D0+f/C8fj/tO72/6bs9f+Y6vP/iuny/4Dp
8f976fD/ferx/4Xs8v+P7/P/mPH1/5/z9v+h9Pj/ovX5/6T2+/+p9vv/s/b7/8L2+v/T9vj/4vX2/+30
9P/w8vH/7u/v/+rt7P/n6ur/5eno/+nq6P/t7ej/7+zn/+rn4v/Z2Nf/vcDG/5uksv95iJ7/XG+Q/0Zb
h/80SYP/JjqB/xswgv8TLIX/Dy6L/w42lP8PQJ3/EEik/xBMqP8QTqr/EE6q/xBNqf8QTan/EE2p/xBN
qf8QTan/EE2p/xBNqf8QTan/EE6q/xBOqv8QTKj/EEik/xBBnv8QOJb/EDCN/xEpg/8QJXf/ECRq/xAk
XP8RJE7/FCRC/xgjNv8fISr/JiEg/ysiGv8sJRr/KSog/yQxKv8gOTb/IEFB/ydKSv8yUVD/QFpX/09l
Yf9ddXH/aY2K/3Sqqf9/yMr/iOHl/5Dx9v+W+P3/mvn9/5z2+v+c8/b/mfH1/5Lv9P+K7fL/gevx/3no
8P9z5u//b+Xv/2rj7v9l4e7/X9/t/1fc7P9O2Ov/RdXq/z3S6f830Oj/Ms7n/y7M5f8qyuT/JMji/x7F
4f8Vw+D/DcDe/wa72v8BtNP/AKrI/wCduf8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AepP/AHyV/weAmP8Uh57/JpGm/zydr/9Vqrr/b7jF/43H0v+s2OD/yOft/97y9v/p+fz/7Pr9/+n6
/f/m+Pv/5fj7/+j5/P/s+vz/7/v9/+37/f/k+fz/0vT6/7rv9/+j6fT/j+Xy/4Pk8f985PD/eeXw/3jn
8P956PD/e+rx/4Dr8f+G7fL/ju7z/5bw9f+g8/f/q/b6/7f4/P/C+v7/zfv+/9j7/v/j+/z/7Pr7//H5
+f/x9vb/7vPz/+rw8P/m7e3/5Ovr/+br6v/q7On/7Ovn/+rn4//g3tv/0NDR/7u+xf+kq7j/jZaq/3V/
m/9bZon/Q015/y44a/8fLGT/GSpk/xcuaf8ZNnD/Gz12/xtAef8bQXr/G0F6/xtAef8bQHn/G0B5/xtA
ef8bQHn/G0B5/xtAef8bQHn/G0F6/xtBev8bQHn/Gz12/xs4cv8bMm3/Gy1n/xwoYP8cJlj/HCRP/xwk
Rf8dIzv/HiMy/yEhKf8lHyD/KR4Z/ysgFv8pJRr/Iy0m/xs4Nv8VRUn/FVNa/yBhaP80cHX/TYCC/2WQ
j/94oZ7/hLSx/47Ix/+U29z/mOvu/5v1+P+b+Pz/mff7/5bz+P+S8PT/ju7z/4rt8v+E7PL/f+rx/3jo
8P9x5u//aePu/2Hf7f9Z3Oz/Utrr/0zY6/9H1ur/QtTq/zzS6f82z+f/L8zl/yfJ4/8gxuH/GcPf/xPB
3v8Nv97/CL3d/wS62f8BtNP/AKrI/wCduv8Akav/AIaf/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AfZb/AH6X/wSBmP8Jg5v/D4ed/xqNov8slqn/RaO0/2i2xP+Sy9b/ueDn/9bv9P/m+Pv/6vr9/+j5
/f/k+Pv/4/f7/+b4+//r+fz/7fr8/+n6/P/c9/v/wvH4/6Pp9P+E4vH/bN3u/2Lc7f9j3e3/aeHu/3Hl
7/936PD/eunw/3vq8f9+6vH/g+vy/43t8/+d8PX/sfT4/8T4+//V+v3/4fz9/+n9/f/u/P3/8fz8//L6
+v/x+Pj/7fb2/+ny8//l8PH/4+3u/+Ts7P/m6+r/6Onn/+fm5P/j4eD/3Nzd/9TV2P/HytD/tbrD/5yh
rf98gJD/W15x/z5AVv8rLUX/IidA/yAoQf8jLUb/JTJL/yY0TP8mNE3/JjRN/yY0Tf8mNEz/JjRM/yY0
TP8mNEz/JjRM/yY0TP8mNE3/JjRN/yY0Tf8mNEz/JjNL/yYwSf8mLUf/JitE/yYoQP8mJzz/JiY4/yYm
M/8mJi7/JyYq/ykkJP8rIh//LSIb/y0kHP8qKyT/ITY0/xZFSf8OVmD/D2d1/x56iP85j5r/WaSr/3i4
u/+Pycn/nNfW/6Pi4f+l6+v/pPHy/6L19/+d9fj/lvP3/47w9f+I7fP/g+vy/4Hr8f9/6vH/fOnw/3fn
8P9u5O//Y+Dt/1jc7P9O2Ov/RtXq/0LU6f8/0+n/PdLp/znR6P8zzuf/Ksrk/yDG4f8Wwt7/Dr7c/wm8
2/8GvNv/A7vb/wK52f8AtNP/AKrI/wCduv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wGAmP8AgJj/AH+X/wOBmf8Nh53/JJOo/0qnuf93wM3/o9jh/8Xq8f/Z9Pn/4fj8/+P4
/P/h9/v/4Pb6/+L3+v/k9/v/4vf7/9v2+v/L8vj/ruv1/4vj8f9p2+7/Utbr/0rW6v9P2ev/W93s/2ni
7v9y5u//dufw/3bo8P936PD/e+nw/4br8v+Z7vT/sfL2/8n2+f/d+vv/6fz8//D9/f/y/f3/8/39//L8
/P/w+vr/7fj4/+n19v/l8vT/4/Dx/+Pt7v/l7Oz/5unp/+bn5v/k5eT/4uTl/97i5P/W3N//x87R/66z
t/+Mj5L/aGdq/0hFRv8zLi//KSUl/ycjJP8qJyj/LSor/y0rLP8tKyz/LSss/y0rLP8tKyz/LSss/y0r
LP8tKyz/LSss/y0rLP8tKyz/LSss/y0rLP8tKyz/LSss/y0qK/8tKSr/LSkq/y0oKf8tKSn/LCkp/ysq
Kf8rLCr/LC0q/y4tKf8xLSf/NC4n/zUyLP8yOzb/KEhJ/xxYX/8Tanj/FH2P/ySSo/9Bqbj/ZcHK/4bW
2/+e5uf/qu/v/6708/+u9fX/qvX2/6X19v+d8/b/k/D0/4jt8/+A6vH/e+nw/3no8P946PD/d+fw/3Lm
7/9p4u7/Xd7t/1DZ6/9F1er/PdLp/znR6P840Oj/N9Do/zXP5/8uzOX/Jcji/xnD3/8Pvtz/Brva/wK5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyU/wB7lP8Cf5j/FYuh/zWesv9dtsf/hc7c/6fh7P+97PX/zfL5/9f1
+v/d9fr/3vX6/9z1+f/W8/n/zPH3/77t9f+r6fP/kOPx/3Lc7v9W1uv/Q9Pp/z7T6f9E1er/Udrr/1/f
7f9p4u7/buTv/2/l7/9x5u//dufw/4Lq8f+U7fP/q/H2/8L1+P/V+Pr/4vv8/+r8/f/v/f7/8v7+//P9
/v/y/P3/7/r7/+v3+f/o9fb/5vP0/+fx8v/p7/D/6u3t/+nr6v/k6Oj/3ubn/9Tj5f/H297/tszO/56x
sv+AjYv/YWVg/0ZDOv80LCL/LCEW/yofFP8tIhf/LyQa/y8lGv8vJRr/LyUa/y8lGv8vJRr/LyUa/y8l
Gv8vJRr/LyUa/y8lGv8vJRr/LyUa/y8lGv8vJRr/LyUa/zAlGv8wJRr/MCUa/y8mHP8tKSD/Kywl/ygw
K/8nNTH/KDk2/y4+Ov83Qj7/P0hC/0VPSf9FWVb/PmZn/zN1fP8rhZL/K5an/zipuv9Rvsz/b9Pd/4zm
6/+g8/b/qvn7/637+/+r+fr/p/b3/6L09v+a8vX/j+/z/4Xs8v986fH/dufw/3Pm7/9x5u//buTv/2ni
7v9h3+3/Vtvs/0rX6v9A0+n/ONDo/zTO5/8yzuf/MM3m/y3L5f8nyeP/HsXg/xPA3f8KvNv/A7nZ/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHuU/wB6k/8BfZb/D4ef/yaYr/9CrsL/YMPW/33V5f+W4u//sOv1/8fx
+P/X9Pn/3fX5/9Xz+P/D7vb/rOjy/5Xi7/+A3e3/a9nr/1fV6v9H0un/PNHo/znR6P8/1On/SNfq/1Tb
7P9d3u3/Y+Dt/2ji7v9t5e//dOfw/3/p8f+O7PL/n+/0/7Hy9v/B9fj/z/j6/9v6+//m/P3/7v3+//P+
/v/1/f7/8/z8/+/6+//s+Pn/6vb3/+z19v/w9fX/8fPz/+3w7//i6ur/0ePm/7va3/+jzdP/jLvB/3eg
pP9hfn7/TVtV/z08Mv8xJxr/LB0P/ysbDf8sHQ//LiAS/y4gEv8uIBL/LiAS/y4gEv8uIBL/LiAS/y4g
Ev8uIBL/LiAS/y4gEv8uIBL/LiAS/y4gEv8uIBL/LiAS/y4gEf8vHxH/LiAS/y0jFv8qKB3/JC8o/x43
NP8cQUH/H0tN/ypVV/87YGD/TWxq/1x4dP9ig4H/X4+P/1eaoP9QprD/TrK//1bAzf9m0Nv/et/o/4zs
8v+Z9fn/n/n8/6H5/P+g9/n/nfT3/5ny9f+T8PT/i+7y/4Pr8f976fD/dOfw/27l7/9p4+7/Y+Dt/13e
7f9W2+z/Tdjr/0XV6v890un/Ns/o/zHN5v8sy+X/KMnk/yPH4v8cxOD/FcHe/w693P8Hutr/ArjY/wC4
2P8Audn/ALna/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Afpb/AHyV/wB8lP8Bfpf/CYaf/xWVrf8lpr7/OLnQ/0/J3/9s1un/kOLw/7Tr
9f/O8fj/2PP5/8rw9/+t6PL/id7t/2jV6P9S0Ob/Rc7l/z3O5v86z+f/ONDo/znR6P880un/QtTq/0nX
6v9Q2ev/WNzs/2Df7f9p4+7/c+bv/33p8P+G6/L/kO3z/5vv9P+n8fX/tfP3/8b2+f/X+fv/5vz9//H9
/v/1/f7/9f39//L7/P/w+vv/7/n6//L6+v/2+vr/9/n5//D19f/e6+3/wN7j/5vN1v93usX/W6Sw/0mL
lP89bXH/NlBO/zI2L/8uJRr/LB0Q/ysbDv8sHRD/LR8T/y0fE/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0f
E/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0fE/8tHxP/LR8T/y0fEv8uHhH/Lh8S/ywjF/8mKiL/HTUy/xVC
RP8RUFf/Fl9p/ydweP9Bgof/XJOV/3Sko/+AsK//grq6/37BxP94x83/dM7W/3bW3v983ub/g+bt/4ns
8/+O8fb/kPP4/5Hz9/+R8fb/kPD0/43u8/+K7fL/huzy/4Dr8f966fD/c+bv/2rj7v9h3+3/WNzs/1DZ
6/9K1+r/RdXq/0HT6f880en/Ns/n/y7M5v8nyeP/H8Xh/xfC3/8Rv93/DL3b/wi72v8Eudn/AbjY/wC4
2P8Audn/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB9lf8AgJj/BIef/weSrP8Mobv/FrDL/ye+2f9Fy+P/cNnr/53l
8v/A7fb/zPD3/7vr9P+U4e7/Z9Tn/z/K4v8qxd//JMTg/yfH4v8vy+X/Nc/n/zjQ6P860en/PNLp/z/T
6f9F1er/Tdjr/1nc7P9l4e7/cOXv/3jo8P996fH/gerx/4Xr8f+N7PL/m+70/7Dy9v/G9fn/2/n7/+v8
/f/y/f3/9f39//T9/f/y/Pz/8vz8//b9/f/5//7/+f79/+/4+f/X7O//r9rh/4DDz/9Tq7v/M5Ok/yR7
iv8iY2z/JkxO/y04NP8wKyP/MCUb/zAjGf8wJRv/MCce/zAnHv8wJx7/MCce/zAnHv8wJx7/MCce/zAn
Hv8wJx7/MCce/zAnHv8wJx7/MCce/zAnHv8wJx7/MCce/zEmHP8xJRv/MSUc/y8qIv8oMy//HUBC/xJQ
Wf8NYnD/E3WF/yiKmf9Ioaz/are9/4jKzP+Z19f/n9/e/57i4/+Z5Ob/leXo/5Hn6/+N6O7/ierw/4Xr
8f+D6/L/gezz/4Hs8v+B6/L/gevy/4Dq8f+A6vH/furx/3zp8f946PD/cOXv/2Xh7v9Z3Oz/Ttjr/0XV
6v9A0+n/PdLp/zzR6f850Oj/NM7n/yvL5P8hxuH/FsLe/w6+3P8Iu9r/BLrZ/wK52f8BuNj/AbjY/wC4
2f8Audr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCQq/8Anbn/AKrI/w231f8pxN//VtLn/4Xe
7v+q5/L/t+r0/6Tl8f972ur/S8zj/yPC3f8Pvdv/Db7c/xbC3/8kyOL/L8zl/zTO5/82z+f/Ns/o/zjQ
6P890un/RtXq/1La6/9f3+3/auPu/3Hl7/9z5u//cubv/3Pm7/945/D/hunx/5zt9P+18vf/zfb5/9/5
+//q+/z/7/z9//L9/f/y/f3/8/39//X////3////8////+f6+//N7fD/o9nh/3LBzv9FqLn/JpGk/xt8
jP8eaXP/KFda/zRIRf86PTf/PDkx/z04L/88OTH/PDoz/zw7M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7
M/88OzP/PDsz/zw7M/88OzP/PDsz/zw7M/88OzP/PDoz/zw5Mf89ODD/PTkx/zo9N/8zR0T/KFVY/x1l
cP8XeIj/HYye/zKhsv9Sucb/ddDY/5Pj5v+l7/D/rPX1/6329v+q9fX/pfP0/5/y9P+W7/P/jO3y/4Pr
8f986fD/eOjw/3bn8P915/D/dOfw/3Tm8P905/D/defw/3Tn8P9x5e//auPu/1/f7f9S2uv/RtXq/z3S
6f840Oj/Ns/o/zbP5/80zuf/L8zl/ybI4/8bw+D/EL/d/we72v8Cudj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCPq/8Am7j/AKjH/wa00/8dv9z/Qsvk/2nW
6f+I3u3/k+Du/4Pc7P9h0ub/Ocbg/xe92/8Hudn/B7ra/w++3f8bxOD/Jsjj/yvL5P8uzOb/Mc3m/zTO
5/850ej/QtTp/0zY6/9X3Oz/YN/t/2bh7v9m4u7/Y+Ht/2Lh7f9n4u7/c+Tv/4jo8v+h7fT/ufL3/8z2
+f/a+fv/5fv8/+39/f/y/v7/8/7+//L////t////5P3+/9X4+v+97fH/mtzk/3LI1P9Ps8L/NqCw/y+Q
nv80gYr/P3R3/0ppZ/9RYVz/VF5X/1RdVv9UXlf/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1Nf
Wf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NfWf9TX1n/U19Z/1NeV/9UXVb/VF1X/1FhXP9Mamj/QnZ5/ziE
jf8zlKL/OKW1/0i3x/9hy9f/fd7m/5Tu8v+j+Pr/qvz9/6z8/f+q+vv/pvf5/6D19/+X8vX/jO/0/4Hr
8v956PD/c+bv/27l7/9r4+7/aOLu/2bh7v9m4u7/Z+Lu/2ji7v9m4e7/YN/t/1fc7P9M2Ov/QtTp/znR
6P80zuf/Mc3m/y7M5v8ry+T/Jsjj/x7F4P8Vwd7/DL3b/wS52f8AuNj/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8Am7n/AKfH/wSz0v8UvNr/LsXg/0rN
5f9f0uf/Z9Tn/1zR5v9EyuL/KMHd/xC72f8FuNj/BLnZ/wq82/8TwN3/G8Pg/yHG4f8nyeP/LMvl/zLO
5/840Oj/P9Pp/0fW6v9O2Ov/VNvs/1jc7P9X3Oz/VNzs/1Tb7P9X3Oz/Y9/t/3Xj7/+K6fL/oe70/7Xy
9//H9vn/2Pn7/+b8/P/w/f7/8v7+/+z+/v/g/P7/0Pn8/770+P+r7PH/k+Ho/3vT3f9mxtH/WLnF/1Sv
uP9ZpKv/YZue/2qUk/9vj4v/cY2I/3GMh/9xjYj/cI2J/3COif9wjon/cI6J/3COif9wjon/cI6J/3CO
if9wjon/cI6J/3COif9wjon/cI6J/3COif9wjon/cI2J/3GNiP9xjIf/cYyI/2+Pi/9rlZT/ZJ6g/16p
r/9atL7/W8DL/2TM2P9z2eP/gubt/5Dw9f+Z9vr/nfn8/5/5/P+e9/r/nPX4/5jz9/+R8fX/ie7z/4Dr
8v946PD/cOXv/2ni7v9h4O3/XN7s/1jc7P9X3Oz/WNzs/1nc7P9Y3Oz/VNvs/07Y6/9H1ur/P9Pp/zjQ
6P8yzuf/LMvl/yfJ4/8hxuH/G8Pg/xTB3v8Ovtz/CLva/wO52P8At9j/ALfX/wC31/8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQq/8AnLn/AKnH/wKz0/8Lutr/GsDe/ynF
4P82x+H/Osjh/zTG4P8mwt3/Fr3b/wm52f8DuNj/ArjY/wW62f8KvNv/EL/c/xbC3v8fxeH/KMnk/zDN
5v830Oj/PdLp/0LU6v9F1er/SNbq/0rX6v9J1+r/R9bq/0fW6v9K1+r/VNrr/2Pe7f915O//ieny/5zu
9P+x8vb/x/b5/9z6+//p/P3/7Pz9/+L7/P/P+Pv/ufT4/6bw9f+Y6/H/jubt/4bg5/+A2uH/fdTb/33P
1P+Ayc3/hcTF/4nAv/+Mvbv/jby5/427uf+NvLn/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428
uv+NvLr/jby6/428uv+NvLr/jby6/428uv+NvLr/jby6/428uf+Nu7j/jby5/4y9u/+KwcD/h8bH/4PM
z/+A0tf/f9jf/4De5f+D5Ov/hunw/4nt8/+L8Pb/jPH3/43x9v+O8fb/jfD1/4vv9P+H7vP/g+zy/37q
8f936PD/buTv/2Th7f9Z3ez/UNnr/0vX6v9J1ur/Sdbq/0rX6v9K1+r/SNbq/0XV6v9C1Or/PdLp/zfQ
6P8wzeb/KMnk/x/F4f8Wwt7/EL/d/wu92/8Hu9r/BLnZ/wK42P8AuNj/ALfY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIaf/wCRq/8Anbr/AKrI/wG00/8Eudn/Cr3c/w++
3P8Uvtz/Fb7b/xO92/8OvNr/CLrZ/wO52P8BuNj/ALjY/wG42P8Dudn/B7va/w6+3P8Xwt//I8fi/y3L
5f81z+f/OdHo/zzS6f890un/PtLp/z/S6f8+0un/PdLp/z3S6f9A0+n/SNbq/1Ta6/9i3+3/c+Tv/4Xp
8f+b7vT/tfL3/8z2+f/d+fv/4Pn7/9T3+v+99Pj/pfD1/5Hs8/+J6/H/ierw/47q7/+V6+7/murt/53p
6/+f5+j/oOXl/6Dj4/+h4uH/oeHg/6Hh4P+h4eD/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh
4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4f+h4eH/oeHh/6Hh4P+h4eD/oeHg/6Hi4f+h4+P/oOXl/5/n
6P+d6ev/muvt/5Xr7/+P6/D/iOvx/4Lq8f9/6vH/ferx/33q8f996vH/ferx/33p8f986fH/e+nx/3no
8P905u//a+Pu/1/e7f9S2uv/R9bq/0DT6f890un/PdLp/z7S6f8/0un/PtLp/z3S6f880un/OdHo/zXP
5/8ty+X/I8fi/xfC3/8Ovtz/B7va/wO52f8Budj/AbjY/wG42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wG6
2v8Budn/AbjY/wG42P8BuNj/ALjY/wC42P8AuNj/ALjY/wC32P8AuNj/ArnY/wi72v8Rv93/HMTg/yfJ
4/8uzOX/M87n/zbP5/830Oj/ONDo/zjQ6P840Oj/N9Do/zfQ6P860ej/QNPp/0nX6v9V2+z/YuDt/3Ll
7/+H6fL/n+30/7bx9//H9Pj/y/T5/8Dz+P+r7/X/lOzz/4Tq8f+A6vH/hezy/5Dv8/+c8vX/pfT2/6j1
9v+q9vb/qfX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j1
9v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qPX2/6j19v+o9fb/qfX2/6r2
9v+o9fb/pfT2/53y9f+T8PT/iO3y/3/q8f946PD/defw/3Lm7/9x5e//cOXv/3Dl7/9x5e//ceXv/3Dl
7/9s5O//ZODu/1jc7P9L1+r/QdPp/zrR6P830Oj/N9Do/zjQ6P840Oj/ONDo/zfQ6P82z+f/M87n/y7M
5f8nyeP/HMTg/xG/3f8Iu9r/ArnY/wC42P8At9j/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC4
2f8At9j/ALbX/wC21/8At9f/ALfY/wC42P8AuNj/ALjY/wC31/8At9f/AbjY/wa62f8Nvdv/FcHe/x7F
4P8lyOL/Ksrk/y7M5f8yzuf/Nc/n/zfQ6P830Oj/Ns/o/zbP6P840Oj/PdLp/0PV6v9M2ev/Vtzs/2Lg
7f9y4+//hubx/5jp8/+m6/X/q+31/6Ts9P+W6/P/h+nx/33p8f986vH/g+3y/47w9P+Z9Pf/ovb4/6X4
+v+m+fv/pfr8/6T6/P+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6
/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+j+v3/o/r9/6P6/f+k+vz/pfr8/6b5
+/+l+Pr/ovb4/5v09/+S8fX/h+3z/37q8f925/D/cOXv/2rj7v9m4e7/Y+Dt/2Lg7f9j4O3/ZOHu/2Th
7v9h4O3/W93t/1HZ6/9H1ur/PtLp/zjQ6P82z+j/Ns/o/zfQ6P830Oj/Nc/n/zLO5/8uzOX/Ksrk/yXI
4v8exeD/FcHe/w292/8Gutn/AbjY/wC31/8At9f/ALfY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALna/wC4
2f8At9j/ALbX/wC21/8At9f/ALfY/wC42P8AuNj/ALjY/wC32P8At9f/AbjY/wS52f8Iu9r/Db3c/xPA
3f8Zw9//IMbh/yfJ4/8uzOX/NM7n/zfQ6P840On/ONDp/zjQ6P850Oj/PNLp/0DU6f9F1ur/TNjr/1Tb
7P9e3e3/at/u/3fg7/+A4vD/huTx/4Xl8f+B5vH/fOfw/3no8P976vH/gezy/4nv9P+R8fX/lvP3/5n0
+P+Z9fn/mfb5/5j2+v+X9vv/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3
+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f3+/+X9/v/l/f7/5f2+/+Y9vr/mfb5/5n1
+f+Z9Pj/l/P3/5Lx9f+M7/T/hO3y/33q8f915/D/bOTu/2Th7f9c3uz/Vtvs/1Pa6/9T2uz/Vdvs/1bb
7P9U2+z/UNnr/0nX6/9D1Or/PNLp/znQ6P840Oj/ONDp/zjQ6f830Oj/NM7n/y7M5f8nyeP/IMbh/xnD
3/8TwN3/Db3c/wi72v8Eudn/AbjY/wC31/8At9f/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC5
2v8AuNj/ALfY/wC32P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK42P8Dudn/Brra/wm8
2/8Pvtz/FsLe/yDG4f8qyuT/Ms3m/zfQ6P850en/OdHp/znQ6P850Oj/OtHo/zzS6f8/0+n/Q9Tq/0fW
6v9M1uv/Udfr/1fY7P9d2ez/Ytvt/2je7v9t4e7/ceTv/3bn8P966fD/furx/4Ls8v+F7fP/h+3z/4ju
9P+J7vT/iO/0/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv
9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/1/4jv9f+I7/X/iO/0/4nu
9P+I7vT/h+3z/4Xt8/+D7PL/f+vx/3rp8P9z5u//aePu/17e7f9T2uv/Stfq/0bV6v9F1er/RtXq/0fW
6v9H1ur/RNXq/0HT6f8+0un/O9Hp/znQ6P850Oj/OdHp/znR6f830Oj/Ms3m/yrK5P8gxuH/FsLe/w++
3P8JvNv/Brra/wO52f8CuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIef/wCRq/8Anrr/AKrI/wCz0/8AuNj/ALra/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wK5
2f8Gu9r/Dr7c/xnD3/8kyOL/Lszl/zTO5/83z+j/N9Do/zbP6P82z+f/Ns/n/zfP5/830Oj/OdDo/zrR
6P870ej/PdHo/z/R6f9C0un/SNXq/1HY6/9c3ez/Z+Hu/3Dl7/915/D/eOjw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no8P956PD/eejw/3no
8P956PD/eejw/3no8P956PD/eOjw/3Xn8P9v5e//ZeHu/1jc7P9L1+r/QdPp/zzR6P850Oj/OdDo/zrQ
6P860Oj/OdDo/zjQ6P83z+f/Ns/n/zbP5/82z+j/N9Do/zfP6P80zuf/Lszl/yTI4v8Zw9//Dr7c/wa7
2v8Cudn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALra/wC42P8As9P/AKrI/wCeuv8Akav/AIef/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALvb/wC6
2v8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC42f8AuNj/ALjY/wC4
2P8Dudn/Crzb/xPB3v8exeH/J8nk/yzM5f8vzeb/L83m/y7M5v8tzOb/Lczm/y3M5f8tzOX/Lczl/y3M
5v8uzOb/L83n/zHO5/81z+j/O9Lp/0XW6v9R2uz/Xd/t/2fi7/9s5O//buXv/27l7/9t5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk7/9s5O//bOTv/2zk
7/9s5O//bOTv/23k7/9u5e//buXv/2zk7/9n4u//Xd/t/1La7P9G1ur/PNLp/zbQ6P8yzuf/MM3n/y7M
5v8tzOb/Lczl/yzM5f8tzOX/Lczm/y3M5v8uzOb/L83m/y/N5v8szOX/J8nk/x7F4f8Twd7/Crzb/wO5
2f8AuNj/ALjY/wC42P8AuNn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC52f8Audn/ALnZ/wC5
2f8Autr/ALvb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrv/AKvJ/wC11P8Autr/ALzc/wC7
3P8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC52v8Audn/ALnZ/wC5
2f8Cutr/B7zb/w6/3v8Ww+D/Hcbi/yHI4/8jyOT/I8nk/yLI5P8iyOP/Icjj/yDI4/8gx+P/H8fj/yDI
5P8jyeT/Jsvm/yrN5/8wz+n/NtLq/z/V6/9K2ez/U9zu/1vf7/9g4e//YeHv/2Dh7/9f4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g7/9e4O//XuDv/17g
7/9e4O//XuDv/1/g7/9g4e//YeHv/2Dh7/9c3+//Vd3u/0zZ7f9D1uz/OtPq/zPQ6f8tzef/KMvm/yTJ
5P8hyOT/H8fj/x/H4/8gx+P/Icjj/yLI4/8iyOT/I8nk/yPI5P8hyOP/Hcbi/xbD4P8Ov97/B7zb/wK6
2v8Audn/ALnZ/wC52f8Audr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC6
2v8Au9z/ALzc/wC62v8AtdT/AKvJ/wCeu/8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCSrP8An7v/AKvK/wC11f8Autv/ALzd/wC8
3P8Au9v/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALna/wC5
2v8Butr/BLvb/wm93f8OwN7/EsHf/xTD4P8Vw+D/FsPg/xXD4P8Vw+D/FMPg/xPC4P8TwuD/E8Lg/xXD
4f8axeL/IMjk/yjM5v8wz+n/N9Lq/z7V6/9E1+z/Stnt/0/b7f9R3O7/Utzu/1Lc7v9R3O7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db7v9Q2+7/UNvu/1Db
7v9Q2+7/UNvu/1Hc7v9S3O7/Utzu/1Hc7v9P2+3/S9nt/0bX7f9A1ez/OdPr/zLQ6f8qzOf/Isnk/xrF
4v8Vw+H/E8Lg/xLC4P8TwuD/FMPg/xXD4P8Vw+D/FsPg/xXD4P8Uw+D/EsHf/w7A3v8Jvd3/BLvb/wG6
2v8Audr/ALna/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC62v8Autr/ALra/wC7
2/8AvNz/ALzd/wC62/8AtdX/AKvK/wCfu/8Akqz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgZn/AIeg/wCRrP8Anrr/AKrI/wC00/8Audn/ALrb/wC6
2v8Audn/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC4
2P8BuNj/ArnZ/wS62f8Gu9r/CLzb/wm82/8Kvdv/Cr3b/wq82/8JvNv/Cbzb/wi82/8HvNv/CLzb/wu9
3P8SwN7/HMTh/ybJ5P8wzeb/N9Do/zvS6f8/0+r/QdTq/0LU6v9D1er/Q9Xq/0PV6v9D1er/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU6v9D1Or/Q9Tq/0PU
6v9D1Or/Q9Tq/0PV6v9D1er/Q9Xq/0PV6v9C1Or/QdTq/z/T6v880un/ONDo/zDN5v8nyeT/HMTh/xLA
3v8Lvdz/CLzb/we82/8IvNv/Cbzb/wm82/8KvNv/Cr3b/wq92/8JvNv/CLzb/wa72v8Eutn/ArnZ/wG4
2P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC42P8AuNj/ALjY/wC5
2f8Autr/ALrb/wC52f8AtNP/AKrI/wCeuv8Akaz/AIeg/wCBmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH6W/wB+lv8AgJn/AIaf/wCQqv8Am7f/AKfE/wCvzv8AtNP/ALXV/wC1
1P8AtNP/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz
0/8As9P/ALTT/wG00/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8As9P/AbTT/wS1
1P8Mudb/Fr3Z/yLC3P8sxt//Msnh/zXK4v82y+L/Nsri/zXK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK
4v82yuL/Nsri/zbK4v82yuL/Nsri/zbK4v81yuL/Nsri/zbL4v81yuL/Msnh/yzG3/8iwtz/Fr3Z/wy5
1v8EtdT/AbTT/wCz0/8BtNP/ArTT/wK00/8CtNP/ArTT/wK00/8CtNP/ArTT/wG00/8BtNP/ALTT/wCz
0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wCz0/8As9P/ALPT/wC0
0/8AtdT/ALXV/wC00/8Ar87/AKfE/wCbt/8AkKr/AIaf/wCAmf8Afpb/AH6W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8Af5f/AH+W/wB/lv8AgJj/AIWe/wCNp/8AlrH/AJ+8/wCnxP8Aqsj/AKvK/wCr
yf8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKnI/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnH/wCpx/8Aqcf/AKnH/wKq
yP8Ircr/EbHN/xu10P8judL/KbvU/yu81P8rvNT/KrzU/ym71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8ou9T/KLvU/yi7
1P8ou9T/KLvU/yi71P8ou9T/KLvU/yi71P8pu9T/KrzU/yu81P8rvNT/KbvU/yO50v8btdD/EbHN/wit
yv8Cqsj/AKnH/wCpx/8Aqcf/AKnH/wCpyP8Aqcj/AKnI/wCpyP8Aqcj/AKnI/wCqyP8Aqsj/AKrI/wCq
yP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCqyP8Aqsj/AKrI/wCq
yP8Aq8n/AKvK/wCqyP8Ap8T/AJ+8/wCWsf8Ajaf/AIWe/wCAmP8Af5b/AH+W/wB/l/8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIOc/wCJov8AkKr/AJax/wCbt/8Anrr/AJ+7/wCe
u/8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrr/AJ26/wCduv8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCcuf8AnLn/AJ25/wKd
uv8GoLv/DKK9/xOlv/8ZqMH/HarC/x6qwv8eqsL/HarC/xyqwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8bqcL/G6nC/xup
wv8bqcL/G6nC/xupwv8bqcL/G6nC/xupwv8cqsL/HarC/x6qwv8eqsL/HarC/xmowf8Tpb//DKK9/wag
u/8Cnbr/AJ25/wCcuf8AnLn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbn/AJ25/wCduf8Anbr/AJ26/wCe
uv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCeuv8Anrr/AJ66/wCe
uv8Anrv/AJ+7/wCeuv8Am7f/AJax/wCQqv8AiaL/AIOc/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AH+X/wB/l/8AgJj/AIKa/wCFnv8AiaL/AI2n/wCQqv8Akaz/AJKs/wCR
rP8Akaz/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wGR
q/8Dkqz/B5St/wuVrv8Ol6//EJiw/xGYsP8RmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCY
sP8QmLD/EJiw/xCYsP8QmLD/EJiw/xCYsP8QmLD/EJiw/xGYsP8RmLD/EJiw/w6Xr/8Lla7/B5St/wOS
rP8Bkav/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJCr/wCQq/8AkKv/AJGr/wCRq/8Akav/AJGr/wCR
q/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCRq/8Akav/AJGr/wCR
rP8Akaz/AJKs/wCRrP8AkKr/AI2n/wCJov8AhZ7/AIKa/wCAmP8Af5f/AH+X/wCAmP8AgJj/AICY/wCA
mP8AgJj7AICY/ACAmPwAgJj8AICY/QCAmP4AgJj/AIGZ/wCCmv8Ag5z/AIWe/wCGn/8Ah5//AIeg/wCH
oP8Ah6D/AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
n/8Ah5//AIef/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCH
oP8Bh6D/A4ig/wSIof8FiaH/Bomh/weJof8HiaH/B4mh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/Bomh/waJ
of8GiaH/Bomh/waJof8GiaH/Bomh/waJof8GiaH/B4mh/weJof8HiaH/Bomh/wWJof8EiKH/A4ig/wGH
oP8Ah6D/AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIaf/wCGn/8Ahp//AIef/wCH
n/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCHn/8Ah5//AIef/wCH
oP8Ah6D/AIeg/wCHn/8Ahp//AIWe/wCDnP8Agpr/AIGZ/wCAmP8AgJj+AICY/QCAmPwAgJj8AICY/ACA
mPsAgJjcAICY3gCAmOEAgJjmAICY7QCAmPQAgJj7AICY/wCAmP8AgJj/AICY/wCAmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCAmf8AgJn/AICZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGB
mf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AYGZ/wGBmf8BgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AICZ/wCAmf8AgJn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCBmf8AgZn/AIGZ/wCB
mf8AgZn/AIGZ/wCBmf8AgJn/AICY/wCAmP8AgJj/AICY/wCAmPsAgJj0AICY7QCAmOYAgJjhAICY3gCA
mNwAgJimAICYqgCAmLEAgJi+AICY0ACAmOMAgJj0AICY/gB/l/8Af5f/AH+W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+W/wB/l/8Af5f/AICY/gCAmPQAgJjjAICY0ACAmL4AgJixAICYqgCA
mKYAgJhoAICYbwCAmHsAgJiSAICYrwCAmNAAgJjtAICY/QB/l/8Af5f/AH+X/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9
lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB9lf8AfZX/AH2V/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+lv8Afpb/AH6W/wB+
lv8Afpb/AH6W/wB+lv8Afpb/AH+X/wB/l/8Af5f/AICY/QCAmO0AgJjQAICYrwCAmJIAgJh7AICYbwCA
mGgAgJgwAICYOQCAmEoAgJhpAICYkgCAmL4AgJjmAICY/ACAmP8AgJj/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wB/
l/8Af5f/AH+X/wB/l/8Af5f/AH+X/wCAmP8AgJj/AICY/ACAmOYAgJi+AICYkgCAmGkAgJhKAICYOQCA
mDAAgJgGAICYEQCAmCYAgJhKAICYewCAmLEAgJjhAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmOEAgJixAICYewCAmEoAgJgmAICYEQCA
mAYAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mAAAgJgAAICYAACAmBQAgJg7AICYcACAmKsAgJjeAICY/ACAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/wCA
mP8AgJj/AICY/wCAmP8AgJj/AICY/wCAmP8AgJj/AICY/ACAmN4AgJirAICYcACAmDsAgJgUAICYAACA
mADAAAAAAAAAAAAAAAAAAAAAAAAMAMAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAwAwAAAAAAAAAAAAAAAAAAAAAAA
DAA=
================================================
FILE: DS_Map/LibNDSFormats/EndianBinaryReader.cs
================================================
// CTools library - Library functions for CTools
// Copyright (C) 2010 Chadderz
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
using System.Text;
using System.Runtime.InteropServices;
namespace System.IO {
public sealed class EndianBinaryReader : IDisposable {
private bool disposed;
private byte[] buffer;
public Stream BaseStream { get; private set; }
public Endianness Endianness { get; set; }
public Endianness SystemEndianness { get { return BitConverter.IsLittleEndian ? Endianness.LittleEndian : Endianness.BigEndian; } }
private bool Reverse { get { return SystemEndianness != Endianness; } }
public EndianBinaryReader(Stream baseStream)
: this(baseStream, Endianness.BigEndian) { }
public EndianBinaryReader(Stream baseStream, Endianness endianness) {
if (baseStream is null){ throw new ArgumentNullException("baseStream"); }
if (!baseStream.CanRead){ throw new ArgumentException("baseStream"); }
BaseStream = baseStream;
Endianness = endianness;
}
~EndianBinaryReader() {
Dispose(false);
}
private void FillBuffer(int bytes, int stride) {
if (buffer is null || buffer.Length < bytes)
buffer = new byte[bytes];
BaseStream.Read(buffer, 0, bytes);
if (Reverse)
for (int i = 0; i < bytes; i += stride) {
Array.Reverse(buffer, i, stride);
}
}
public byte ReadByte() {
FillBuffer(1, 1);
return buffer[0];
}
public byte[] ReadBytes(int count) {
byte[] temp;
FillBuffer(count, 1);
temp = new byte[count];
Array.Copy(buffer, 0, temp, 0, count);
return temp;
}
public sbyte ReadSByte() {
FillBuffer(1, 1);
unchecked {
return (sbyte)buffer[0];
}
}
public sbyte[] ReadSBytes(int count) {
sbyte[] temp;
temp = new sbyte[count];
FillBuffer(count, 1);
unchecked {
for (int i = 0; i < count; i++) {
temp[i] = (sbyte)buffer[i];
}
}
return temp;
}
public char ReadChar(Encoding encoding) {
int size;
size = GetEncodingSize(encoding);
FillBuffer(size, size);
return encoding.GetChars(buffer, 0, size)[0];
}
public char[] ReadChars(Encoding encoding, int count) {
int size;
size = GetEncodingSize(encoding);
FillBuffer(size * count, size);
return encoding.GetChars(buffer, 0, size * count);
}
private static int GetEncodingSize(Encoding encoding) {
if (encoding == Encoding.UTF8 || encoding == Encoding.ASCII)
return 1;
else if (encoding == Encoding.Unicode || encoding == Encoding.BigEndianUnicode)
return 2;
return 1;
}
public string ReadStringNT(Encoding encoding) {
string text;
text = "";
do {
text += ReadChar(encoding);
} while (!text.EndsWith("\0", StringComparison.Ordinal));
return text.Remove(text.Length - 1);
}
public string ReadString(Encoding encoding, int count) {
return new string(ReadChars(encoding, count));
}
public double ReadDouble() {
const int size = sizeof(double);
FillBuffer(size, size);
return BitConverter.ToDouble(buffer, 0);
}
public double[] ReadDoubles(int count) {
const int size = sizeof(double);
double[] temp;
temp = new double[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToDouble(buffer, size * i);
}
return temp;
}
public Single ReadSingle() {
const int size = sizeof(Single);
FillBuffer(size, size);
return BitConverter.ToSingle(buffer, 0);
}
public Single[] ReadSingles(int count) {
const int size = sizeof(Single);
Single[] temp;
temp = new Single[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToSingle(buffer, size * i);
}
return temp;
}
public Int32 ReadInt32() {
const int size = sizeof(Int32);
FillBuffer(size, size);
return BitConverter.ToInt32(buffer, 0);
}
public Int32[] ReadInt32s(int count) {
const int size = sizeof(Int32);
Int32[] temp;
temp = new Int32[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToInt32(buffer, size * i);
}
return temp;
}
public Int64 ReadInt64() {
const int size = sizeof(Int64);
FillBuffer(size, size);
return BitConverter.ToInt64(buffer, 0);
}
public Int64[] ReadInt64s(int count) {
const int size = sizeof(Int64);
Int64[] temp;
temp = new Int64[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToInt64(buffer, size * i);
}
return temp;
}
public Int16 ReadInt16() {
const int size = sizeof(Int16);
FillBuffer(size, size);
return BitConverter.ToInt16(buffer, 0);
}
public Int16[] ReadInt16s(int count) {
const int size = sizeof(Int16);
Int16[] temp;
temp = new Int16[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToInt16(buffer, size * i);
}
return temp;
}
public ushort ReadUInt16() {
const int size = sizeof(ushort);
FillBuffer(size, size);
return BitConverter.ToUInt16(buffer, 0);
}
public ushort[] ReadUInt16s(int count) {
const int size = sizeof(ushort);
ushort[] temp;
temp = new ushort[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToUInt16(buffer, size * i);
}
return temp;
}
public UInt32 ReadUInt32() {
const int size = sizeof(UInt32);
FillBuffer(size, size);
return BitConverter.ToUInt32(buffer, 0);
}
public UInt32[] ReadUInt32s(int count) {
const int size = sizeof(UInt32);
UInt32[] temp;
temp = new UInt32[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToUInt32(buffer, size * i);
}
return temp;
}
public UInt64 ReadUInt64() {
const int size = sizeof(UInt64);
FillBuffer(size, size);
return BitConverter.ToUInt64(buffer, 0);
}
public UInt64[] ReadUInt64s(int count) {
const int size = sizeof(UInt64);
UInt64[] temp;
temp = new UInt64[count];
FillBuffer(size * count, size);
for (int i = 0; i < count; i++) {
temp[i] = BitConverter.ToUInt64(buffer, size * i);
}
return temp;
}
public void Close() {
Dispose();
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing) {
if (!disposed) {
if (disposing) {
if (BaseStream != null) {
BaseStream.Close();
}
}
buffer = null;
disposed = true;
}
}
}
public enum Endianness {
BigEndian,
LittleEndian,
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/Face.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System;
public class Face
{
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/Group.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System;
using System.Collections.Generic;
using System.Reflection;
public class Group
{
private List PolygonList = new List();
public void Add(Polygon g)
{
this.PolygonList.Add(g);
}
public IEnumerator GetEnumerator()
{
return this.PolygonList.GetEnumerator();
}
public Polygon this[int i]
{
get
{
return this.PolygonList[i];
}
set
{
this.PolygonList[i] = value;
}
}
public Polygon[] Polygons
{
get
{
return this.PolygonList.ToArray();
}
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/OBJWriter.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using OpenTK;
using System;
using System.Collections.Generic;
public class OBJWriter
{
private List Normals = new List();
private List TexCoords = new List();
private List Vertices = new List();
public void AddTriangle(Vector3[] Vertice)
{
this.Vertices.AddRange(Vertice);
}
public void AddTriangle(Vector3[] Vertice, Vector2 TexCoord)
{
this.Vertices.AddRange(Vertice);
this.TexCoords.Add(TexCoord);
}
public void AddTriangle(Vector3[] Vertice, Vector3 Normal)
{
this.Vertices.AddRange(Vertice);
this.Normals.Add(Normal);
}
public void AddTriangle(Vector3[] Vertice, Vector2 TexCoord, Vector3 Normal)
{
this.Vertices.AddRange(Vertice);
this.TexCoords.Add(TexCoord);
this.Normals.Add(Normal);
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/Polygon.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using OpenTK;
using System;
public class Polygon
{
public Vector3[] Normals;
public PolygonType PolyType;
public Vector2[] TexCoords;
public Vector3[] Vertex;
public Polygon(PolygonType PolyType, Vector3[] Normals, Vector2[] TexCoords, Vector3[] Vertex)
{
this.PolyType = PolyType;
this.Normals = Normals;
this.TexCoords = TexCoords;
this.Vertex = Vertex;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/PolygonType.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System;
public enum PolygonType
{
Triangle,
Quad,
TriangleStrip,
QuadStrip
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/Quad.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System.Windows;
using System.Windows.Media.Media3D;
public class Quad : Face
{
public Vector3D[] Normal = new Vector3D[4];
public Point[] TexCoord = new Point[4];
public Point3D[] Vertex = new Point3D[4];
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/QuadStrip.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Media3D;
public class QuadStrip : Face
{
public List Normal = new List();
public List TexCoord = new List();
public List Vertex = new List();
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/Triangle.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System.Windows;
using System.Windows.Media.Media3D;
public class Triangle : Face
{
public Vector3D[] Normal = new Vector3D[3];
public Point[] TexCoord = new Point[3];
public Point3D[] Vertex = new Point3D[3];
}
}
================================================
FILE: DS_Map/LibNDSFormats/Export3DTools/TriangleStrip.cs
================================================
namespace MKDS_Course_Editor.Export3DTools
{
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Media3D;
public class TriangleStrip : Face
{
public List Normal = new List();
public List TexCoord = new List();
public List Vertex = new List();
}
}
================================================
FILE: DS_Map/LibNDSFormats/Helper.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using OpenTK;
namespace SM64DSe {
static class Helper {
public static ushort ColorToBGR15(Color color) {
uint r = (uint)((color.R & 0xF8) >> 3);
uint g = (uint)((color.G & 0xF8) << 2);
uint b = (uint)((color.B & 0xF8) << 7);
return (ushort)(r | g | b);
}
public static Color BGR15ToColor(ushort bgr15) {
byte red = (byte)((bgr15 << 3) & 0xF8);
byte green = (byte)((bgr15 >> 2) & 0xF8);
byte blue = (byte)((bgr15 >> 7) & 0xF8);
return Color.FromArgb(red, green, blue);
}
public static ushort BlendColorsBGR15(ushort c1, int w1, ushort c2, int w2) {
int r1 = c1 & 0x1F;
int g1 = (c1 >> 5) & 0x1F;
int b1 = (c1 >> 10) & 0x1F;
int r2 = c2 & 0x1F;
int g2 = (c2 >> 5) & 0x1F;
int b2 = (c2 >> 10) & 0x1F;
int rf = ((r1 * w1) + (r2 * w2)) / (w1 + w2);
int gf = ((g1 * w1) + (g2 * w2)) / (w1 + w2);
int bf = ((b1 * w1) + (b2 * w2)) / (w1 + w2);
return (ushort)(rf | (gf << 5) | (bf << 10));
}
public static bool VectorsEqual(Vector3 a, Vector3 b) {
float epsilon = 0.00001f;
if (Math.Abs(a.X - b.X) > epsilon){ return false; }
if (Math.Abs(a.Y - b.Y) > epsilon){ return false; }
if (Math.Abs(a.Z - b.Z) > epsilon){ return false; }
return true;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBCA/NSBCA.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace MKDS_Course_Editor.NSBCA {
public class NSBCA {
public struct NSBCA_File {
public header Header;
public struct header {
public string ID;
public byte[] Magic;
public Int32 file_size;
public Int16 header_size;
public Int16 nSection;
public Int32[] Section_Offset;
}
public jnt0 JNT0;
public struct jnt0 //Scale Rotation and Translation
{
public string ID;
public Int32 Size;
//3D Info Structure
public byte dummy;
public byte num_objs;
public short section_size;
public UnknownBlock unknownBlock;
public Info infoBlock;
public string[] names;
public struct UnknownBlock {
public short header_size;
public short section_size;
public int constant; // 0x017F
public short[] unknown1;
public short[] unknown2;
}
public struct Info {
public short header_size;
public short data_size;
public info[] Data;
public struct info {
public Int32 Objectoffset;
}
}
}
public J_AC[] JAC;
public struct J_AC {
public string ID;
public Int16 NrFrames;
public Int16 NrObjects;
public Int32 Unknown1;
public Int32 Offset1;
public Int32 Offset2;
public byte[] JointData;
public byte[] RotationData;
public Int32[] ObjInfoOffset;
public objInfo[] ObjInfo;
public struct objInfo {
public Int16 Flag;
public byte Unknown1;
public byte ID;
public int tStart;
public int tEnd;
public int rStart;
public int rEnd;
public int sStart;
public int sEnd;
public List[] translate;
public List[] translate_keyframes;
public List rotate;
public List[] rotate_keyframes;
public List[][] scale;
public List[][] scale_keyframes;
}
}
}
/*
* I've been studying the NSBCA format heavily over the last few days trying to figure it out.
* I've determined that the first offset in a joint animation contains Pivoting data, and the second section contains Rotation data.
* Rotation keyframes are called when the second byte equals 0 and Pivot keyframes are called when it equals 128, however the data itself is definitely stored a little differently to how it is stored in NSBMD files.
* Scaling keyframes hold two scaling values for whatever reason, with Translation keyframes being just straight values that can be a signed word/dword.
* Each animation has a frame length, however each object in an animation seems to have a start and end position that typically don't match up with the total number of frames.
* Now I haven't had much experience with model animations, but I'm guessing this might have like a decay effect on the animation if anyone has ever played around with animations in Maya?
* The trickiest part is calculating the right number of keyframes stored in each object as there isn't an actual value written down anywhere.
* From what I can tell it's calculated based on a bunch of things including the difference in object frame length over animation frame length, the rate in which the object (and possibly the animation) plays back as well as rounding to the upper whole number.
* This looks a bit funky and overcomplicated but so far all the animations I've been working with calculate the correct number of keyframes, so I'm assuming I'm on the right track.
* Am yet to get to the point of loading animations into a model, but hopefully I won't get some spastic result :S
Object Flag: --zyx-Sr-RZYX-T-
> found in the header of each object of an animation
===========================
T - has Translation keyframes (0 Yes| 1 No)
XYZ - flags for Translation attributes
R - has Rotation/Pivot keyframes (0 Yes| 1 No)
r - flag for Rotation/Pivot attribute
S - has Scale keyframes (0 Yes| 1 No)
xyz - flags for Scale attributes
===========================
if T-XYZ = 1
> Fixed Translation value (signed dword)
if R-r = 1
> Fixed Rotation/Pivot value (dword/2*word?)
if S-xyz = 1
> Fixed Scale value (2*dword)
Note: The below is only done when the bit flag equals 0 for that attribute (TX, TY, TZ, R/P, SX, SY, SZ)
a|b = datasize = playback speed
> a & b are flags stored in the object header for each attribute
Translate
-----------------------------------------------------------
2|0 = word = 1/1
2|1 = word = 1/2
2|2 = word = 1/3
0|1 = dword = 1/2
Rotate
-----------------------------------------------------------
0|0 = 2*byte = 1/1
0|1 = 2*byte = 1/2
0|2 = 2*byte = 1/3
> byte0 = index
> byte1 = 0 Rotation | 128 Pivot
> not completely sure on rotation yet
Scale
-----------------------------------------------------------
2|1 = 2*word = 1/1
2|1 = 2*word = 1/2
-----------------------------------------------------------
Attribute [animation flag|start|end|a|b] bytes/keyframes - animation length
> bytes - the actual size of the data stored
> keyframes - bytes/datasize(see above)
Basabasa - 0 Pivot - 33 Rotation
===========================================================
Translate [3|0|34|2|1] 38/19 - 36 Frames
Rotate [3|0|34|0|1] 38/19 - 36 Frames
Scale [3|0|34|2|1] 76/19 - 36 Frames
===========================================================
Basabasa2 - 1 Pivot - 20 Rotation
===========================================================
Rotate [3|0|78|0|1] 82/41 - 80 Frames
===========================================================
Bilikyu - 31 Pivot
===========================================================
Translate [3|0|58|2|1] 62/31 - 60 Frames
Rotate [3|0|58|0|1] 62/31 - 60 Frames
===========================================================
Donketu - 12 Pivot / 20 Rotation
===========================================================
Translate [3|0|10|0|1] 24/06 - 11 Frames (dword)
Translate [3|0|10|2|1] 12/06 - 11 Frames
Translate [1|0|02|2|0] 04/02 - 02 Frames
Rotate [3|0|10|0|1] 14/07 - 11 Frames
===========================================================
Gesso - 39 Pivot
===========================================================
Translate [0|0|16|2|2] 14/07 - 19 Frames
Translate [0|0|16|2|2] 12/06 - 18 Frames
Translate [0|0|12|2|2] 10/05 - 14 Frames
Scale [0|0|16|2|2] 28/07 - 19 Frames
Scale [0|0|16|2|2] 24/06 - 18 Frames
Rotate [0|0|16|0|2] 16/08 - 19 Frames
Rotate [0|0|16|0|2] 16/08 - 18 Frames
Rotate [0|0|12|0|2] 14/07 - 14 Frames
===========================================================
TTL Bird
===========================================================
Translate [1|0|05|2|0] 10/05 - 05 Frames
Rotate [1|0|05|0|0] 10/05 - 05 Frames
===========================================================
Gamaguchi - 11 Pivot - 52 Rotation
===========================================================
Translate [3|0|08|2|0] 16/08 - 08 Frames
Translate [3|0|07|2|0] 14/07 - 07 Frames
Translate [3|0|16|2|0] 32/16 - 16 Frames
Rotate [3|0|08|0|0] 16/08 - 08 Frames
Rotate [1|0|07|0|0] 14/07 - 07 Frames
Rotate [3|0|16|0|0] 32/16 - 16 Frames
Scale [3|0|08|2|0] 32/08 - 08 Frames
Scale [1|0|07|2|0] 28/07 - 07 Frames
===========================================================
*/
public static NSBCA_File Read(string Filename) {
byte[] file_ = File.ReadAllBytes(Filename);
if (file_[0] == 76 && file_[1] == 90 && file_[2] == 55 && file_[3] == 55) {
}
EndianBinaryReader er = new EndianBinaryReader(new MemoryStream(file_), Endianness.LittleEndian);
NSBCA_File ns = new NSBCA_File();
ns.Header.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.Header.ID == "BCA0") {
ns.Header.Magic = er.ReadBytes(4);
ns.Header.file_size = er.ReadInt32();
ns.Header.header_size = er.ReadInt16();
ns.Header.nSection = er.ReadInt16();
ns.Header.Section_Offset = new Int32[ns.Header.nSection];
for (int i = 0; i < ns.Header.nSection; i++) {
ns.Header.Section_Offset[i] = er.ReadInt32();
}
ns.JNT0.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.JNT0.ID == "JNT0") {
ns.JNT0.Size = er.ReadInt32();
//3D Info Structure
ns.JNT0.dummy = er.ReadByte();
ns.JNT0.num_objs = er.ReadByte();
ns.JNT0.section_size = er.ReadInt16();
ns.JNT0.unknownBlock.header_size = er.ReadInt16();
ns.JNT0.unknownBlock.section_size = er.ReadInt16();
ns.JNT0.unknownBlock.constant = er.ReadInt32();
ns.JNT0.unknownBlock.unknown1 = new short[ns.JNT0.num_objs];
ns.JNT0.unknownBlock.unknown2 = new short[ns.JNT0.num_objs];
for (int i = 0; i < ns.JNT0.num_objs; i++) {
ns.JNT0.unknownBlock.unknown1[i] = er.ReadInt16();
ns.JNT0.unknownBlock.unknown2[i] = er.ReadInt16();
}
ns.JNT0.infoBlock.header_size = er.ReadInt16();
ns.JNT0.infoBlock.data_size = er.ReadInt16();
ns.JNT0.infoBlock.Data = new NSBCA_File.jnt0.Info.info[ns.JNT0.num_objs];
for (int i = 0; i < ns.JNT0.num_objs; i++) {
ns.JNT0.infoBlock.Data[i].Objectoffset = er.ReadInt32();
}
ns.JNT0.names = new string[ns.JNT0.num_objs];
for (int i = 0; i < ns.JNT0.num_objs; i++) {
ns.JNT0.names[i] = er.ReadString(Encoding.ASCII, 16).Replace("\0", "");
}
ns.JAC = new NSBCA_File.J_AC[ns.JNT0.num_objs];
for (int i = 0; i < ns.JNT0.num_objs; i++) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.JNT0.infoBlock.Data[i].Objectoffset;
ns.JAC[i].ID = er.ReadString(Encoding.ASCII, 4);
if (ns.JAC[i].ID == "J" + (char)0x00 + "AC") {
ns.JAC[i].NrFrames = er.ReadInt16();
ns.JAC[i].NrObjects = er.ReadInt16();
ns.JAC[i].Unknown1 = er.ReadInt32();
ns.JAC[i].Offset1 = er.ReadInt32();
ns.JAC[i].Offset2 = er.ReadInt32();
long curposs = er.BaseStream.Position;
if (ns.JAC[i].Offset2 != ns.JAC[i].Offset1) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.JNT0.infoBlock.Data[i].Objectoffset + ns.JAC[i].Offset1;
ns.JAC[i].JointData = er.ReadBytes(ns.JAC[i].Offset2 - ns.JAC[i].Offset1);
er.BaseStream.Position = curposs;
}
long dataoffset = 0;
ns.JAC[i].ObjInfoOffset = new Int32[ns.JAC[i].NrObjects];
for (int j = 0; j < ns.JAC[i].NrObjects; j++) {
ns.JAC[i].ObjInfoOffset[j] = er.ReadInt16();
}
ns.JAC[i].ObjInfo = new NSBCA_File.J_AC.objInfo[ns.JAC[i].NrObjects];
for (int j = 0; j < ns.JAC[i].NrObjects; j++) {
er.BaseStream.Position = ns.Header.Section_Offset[0] +/* ns.JNT0.section_size*/ns.JNT0.infoBlock.Data[i].Objectoffset + ns.JAC[i].ObjInfoOffset[j];// + 8;
ns.JAC[i].ObjInfo[j].Flag = er.ReadInt16();
ns.JAC[i].ObjInfo[j].Unknown1 = er.ReadByte();
ns.JAC[i].ObjInfo[j].ID = er.ReadByte();
ns.JAC[i].ObjInfo[j].translate = new List[3];
ns.JAC[i].ObjInfo[j].translate[0] = new List();
ns.JAC[i].ObjInfo[j].translate[1] = new List();
ns.JAC[i].ObjInfo[j].translate[2] = new List();
ns.JAC[i].ObjInfo[j].translate_keyframes = new List[3];
ns.JAC[i].ObjInfo[j].translate_keyframes[0] = new List();
ns.JAC[i].ObjInfo[j].translate_keyframes[1] = new List();
ns.JAC[i].ObjInfo[j].translate_keyframes[2] = new List();
ns.JAC[i].ObjInfo[j].rotate = new List();
ns.JAC[i].ObjInfo[j].rotate_keyframes = new List[2];
ns.JAC[i].ObjInfo[j].rotate_keyframes[0] = new List();
ns.JAC[i].ObjInfo[j].rotate_keyframes[1] = new List();
ns.JAC[i].ObjInfo[j].scale = new List[3][];
ns.JAC[i].ObjInfo[j].scale[0] = new List[2];
ns.JAC[i].ObjInfo[j].scale[1] = new List[2];
ns.JAC[i].ObjInfo[j].scale[2] = new List[2];
ns.JAC[i].ObjInfo[j].scale[0][0] = new List();
ns.JAC[i].ObjInfo[j].scale[0][1] = new List();
ns.JAC[i].ObjInfo[j].scale[1][0] = new List();
ns.JAC[i].ObjInfo[j].scale[1][1] = new List();
ns.JAC[i].ObjInfo[j].scale[2][0] = new List();
ns.JAC[i].ObjInfo[j].scale[2][1] = new List();
ns.JAC[i].ObjInfo[j].scale_keyframes = new List[3][];
ns.JAC[i].ObjInfo[j].scale_keyframes[0] = new List[2];
ns.JAC[i].ObjInfo[j].scale_keyframes[1] = new List[2];
ns.JAC[i].ObjInfo[j].scale_keyframes[2] = new List[2];
ns.JAC[i].ObjInfo[j].scale_keyframes[0][0] = new List();
ns.JAC[i].ObjInfo[j].scale_keyframes[0][1] = new List();
ns.JAC[i].ObjInfo[j].scale_keyframes[1][0] = new List();
ns.JAC[i].ObjInfo[j].scale_keyframes[1][1] = new List();
ns.JAC[i].ObjInfo[j].scale_keyframes[2][0] = new List();
ns.JAC[i].ObjInfo[j].scale_keyframes[2][1] = new List();
double[] speed = {
1.0D, 0.5D, 0.33333333333333331D
};
if (((ns.JAC[i].ObjInfo[j].Flag >> 1) & 1) == 0) {
//struct.DModelAnimation.MTransformAni trans[] = new struct.DModelAnimation.MTransformAni[3];
//string msg = new StringBuilder().Append(msg).Append("\n -> Translate: ").ToString();
//string[] type = { "X", "Y", "Z" };
for (int k = 0; k < 3; k++) {
//trans[k] = new struct.DModelAnimation.MTransformAni(this);
int tflag = ns.JAC[i].ObjInfo[j].Flag >> 3 + k & 1;
//msg = new StringBuilder().Append(msg).Append("\n -> T").Append(type[k]).Append(tflag).Append("[").ToString();
if (tflag == 1) {
int tvar = er.ReadInt32();
//trans[k].setFrame((float)tvar / divide);
ns.JAC[i].ObjInfo[j].translate[k].Add((float)tvar / 4096f);
//msg = (new StringBuilder()).Append(msg).Append(tvar).ToString();
continue;
} else {
int param2 = er.ReadInt32();
int startFrame = param2 & 0xffff;
ns.JAC[i].ObjInfo[j].tStart = startFrame;
int endFrame = param2 >> 16 & 0xfff;
ns.JAC[i].ObjInfo[j].tEnd = endFrame;
int var2 = param2 >> 28 & 3;
int speedId = param2 >> 30 & 3;
int toffset = er.ReadInt32();
int width = var2 != 0 ? 2 : 4;
int extra = (ns.JAC[i].Unknown1 != 3 ? 0 : ns.JAC[i].NrFrames - endFrame);
int length = (int)Math.Ceiling((double)(ns.JAC[i].NrFrames + extra) * speed[speedId]);
long curpos = er.BaseStream.Position;
for (int t = 0; t < length; t++) {
er.BaseStream.Position = ns.Header.Section_Offset[0] +/* ns.JNT0.section_size*/ns.JNT0.infoBlock.Data[i].Objectoffset + toffset + (t * width);
if (dataoffset == 0) {
dataoffset = toffset;
}
float keyFrame = (width != 2 ? (float)er.ReadInt32() : (float)er.ReadInt16());
ns.JAC[i].ObjInfo[j].translate_keyframes[k].Add((float)LibNDSFormats.NSBMD.NSBMDGlRenderer.Sign((int)keyFrame, (width != 2 ? 32 : 16)) / 4096f);
//m = (new StringBuilder()).append(m).append("\n -> #").append(t).append(": ").append(keyFrame).toString();
}
er.BaseStream.Position = curpos;
}
}
}
if (((ns.JAC[i].ObjInfo[j].Flag >> 6) & 1) == 0) {
int rflag = ns.JAC[i].ObjInfo[j].Flag >> 8 & 1;
if (rflag == 1) {
//dataParser _tmp14 = pa;
int rvar = er.ReadInt32(); //dataParser.getInt(data, jump, 4);
ns.JAC[i].ObjInfo[j].rotate.Add((float)rvar);
//msg = (new StringBuilder()).append(msg).append(rvar).toString();
//jump += 4;
} else {
int param2 = er.ReadInt32();
int startFrame = param2 & 0xffff;
ns.JAC[i].ObjInfo[j].rStart = startFrame;
int endFrame = param2 >> 16 & 0xfff;
ns.JAC[i].ObjInfo[j].rEnd = endFrame;
int var2 = param2 >> 28 & 3;
int speedId = param2 >> 30 & 3;
int roffset = er.ReadInt32();
int width = 2;//var2 != 0 ? 2 : 4;
int length = (int)Math.Ceiling((double)(ns.JAC[i].NrFrames) * speed[speedId]);
long curpos = er.BaseStream.Position;
for (int r = 0; r < length; r++) {
er.BaseStream.Position = ns.Header.Section_Offset[0] +/* ns.JNT0.section_size*/ns.JNT0.infoBlock.Data[i].Objectoffset + roffset + (r * width);
if (dataoffset == 0) {
dataoffset = roffset;
}
int rvar6 = er.ReadInt16();
int rindex = rvar6 & 0x7fff;
int mode = rvar6 >> 15 & 1;
ns.JAC[i].ObjInfo[j].rotate_keyframes[0].Add(rindex);
ns.JAC[i].ObjInfo[j].rotate_keyframes[1].Add(mode);
}
er.BaseStream.Position = curpos;
}
}
if ((ns.JAC[i].ObjInfo[j].Flag >> 9 & 1) == 0) {
//struct.DModelAnimation.MScaleAni scale[] = new struct.DModelAnimation.MScaleAni[3];
//msg = (new StringBuilder()).append(msg).append("\n -> Scale: ").toString();
for (int k = 0; k < 3; k++) {
//scale[k] = new struct.DModelAnimation.MScaleAni(this);
int sflag = ns.JAC[i].ObjInfo[j].Flag >> 11 + k & 1;
//msg = (new StringBuilder()).append(msg).append("\n -> S").append(type[k]).append(sflag).append("[").toString();
if (sflag == 1) {
//dataParser _tmp19 = pa;
int svar1 = er.ReadInt32();//dataParser.getInt(data, jump, 4);
ns.JAC[i].ObjInfo[j].scale[k][0].Add((float)svar1 / 4096f);
//dataParser _tmp20 = pa;
int svar2 = er.ReadInt32();//dataParser.getSign(data, jump + 4, 4);
ns.JAC[i].ObjInfo[j].scale[k][1].Add((float)svar2 / 4096f);
//int svar3 = er.ReadInt32();//dataParser.getSign(data, jump + 4, 4);
//int svar4 = er.ReadInt32();//dataParser.getSign(data, jump + 4, 4);
//ns.JAC[i].ObjInfo[j].scale[k][1].Add((float)svar2 / 4096f);
//scale[k].setFrame(new float[] {
// (float)svar1 / divide, (float)svar2 / divide
//});
//msg = (new StringBuilder()).append(msg).append(svar1).append("|").append(svar2).toString();
//jump += 8;
continue;
} else {
int param2 = er.ReadInt32();
int startFrame = param2 & 0xffff;
ns.JAC[i].ObjInfo[j].sStart = startFrame;
int endFrame = param2 >> 16 & 0xfff;
ns.JAC[i].ObjInfo[j].sEnd = endFrame;
int var2 = param2 >> 28 & 3;
int speedId = param2 >> 30 & 3;
int soffset = er.ReadInt32();
int width = var2 != 0 ? 2 : 4;
int length = (int)Math.Ceiling((double)(ns.JAC[i].NrFrames) * speed[speedId]);
long curpos = er.BaseStream.Position;
for (int s = 0; s < length; s++) {
er.BaseStream.Position = ns.Header.Section_Offset[0] +/* ns.JNT0.section_size*/ns.JNT0.infoBlock.Data[i].Objectoffset + soffset + (s * width * 2);
if (dataoffset == 0) {
dataoffset = soffset;
}
ns.JAC[i].ObjInfo[j].scale_keyframes[k][0].Add((float)(width != 2 ? (float)er.ReadInt32() : (float)er.ReadInt16()) / 4096f);
ns.JAC[i].ObjInfo[j].scale_keyframes[k][1].Add((float)(width != 2 ? (float)er.ReadInt32() : (float)er.ReadInt16()) / 4096f);
}
er.BaseStream.Position = curpos;
}
}
}
}
if (dataoffset != 0) {
curposs = er.BaseStream.Position;
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.JNT0.infoBlock.Data[i].Objectoffset + ns.JAC[i].Offset2;
ns.JAC[i].RotationData = er.ReadBytes((int)dataoffset - ns.JAC[i].Offset2);
er.BaseStream.Position = curposs;
}
} else {
//MessageBox.Show("Error");
er.Close();
return ns;
}
}
} else {
//MessageBox.Show("Error");
er.Close();
return ns;
}
} else {
//MessageBox.Show("Error");
er.Close();
return ns;
}
er.Close();
return ns;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBCA/NSBCALoader.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using LibNDSFormats.NSBMD;
namespace LibNDSFormats.NSBCA {
///
/// Loader for NSBCA files & data.
///
public static class NSBCALoader {
#region Methods (2)
// Public Methods (2)
///
/// Load NSBTX from stream.
///
/// Stream to use.
/// Material definitions.
public static IEnumerable LoadNsbca(Stream stream) {
List animation = new List();
var reader = new EndianBinaryReader(stream, Endianness.LittleEndian);
byte[] id = reader.ReadBytes(4);
if (id == new byte[] { 0x42, 0x43, 0x41, 0x30 }) {
throw new Exception();
}
reader.BaseStream.Position += 2;
int i = reader.ReadUInt16();
if (i == NSBMD.NSBMD.NDS_TYPE_UNK1) {
i = reader.ReadInt32();
if (i == stream.Length) {
int numblock = reader.ReadInt32();
numblock >>= 16;
int r = reader.ReadInt32();
id = reader.ReadBytes(4);
if (numblock == 1 && r == 0x14) {
animation.AddRange(ReadJnt0(stream, 0x14));
}
}
}
reader.Close();
return animation;
}
///
/// Load NSBTX from file.
///
/// File to use.
/// Material definitions.
public static IEnumerable LoadNsbca(FileInfo fileInfo) {
IEnumerable result = null;
using (var fileStream = new FileStream(fileInfo.FullName, FileMode.Open)) {
result = LoadNsbca(fileStream);
}
return result;
}
///
/// Load materials in stream.
///
/// Stream to use.
/// Material definitions.
public static IEnumerable ReadJnt0(Stream stream, int blockoffset) {
EndianBinaryReader reader = new EndianBinaryReader(stream, Endianness.LittleEndian);
int blocksize, blockptr, blocklimit;
int num, objnum, i, j, r;
List dataoffset = new List();
int sec1offset, sec2offset;
NSBMDAnimation[] animation = new NSBMDAnimation[1];
List animlen = new List();
////////////////////////////////////////////////
// joint
blockptr = blockoffset + 4; // already read the ID, skip 4 bytes
blocksize = reader.ReadInt32(); // block size
blocklimit = blocksize + blockoffset;
reader.ReadByte(); // skip dummy 0
num = reader.ReadByte(); //assert(num > 0); // no of joint must == 1
Console.WriteLine("No. of Joint = %02x\n", num);
//dataoffset = (int*)malloc(sizeof(int));
//if (!dataoffset){ return NULL; }
reader.BaseStream.Seek(10 + (num << 2), SeekOrigin.Current); // skip [char xyz], useless
blockptr += 10;
reader.BaseStream.Seek(4, SeekOrigin.Current); // go straight to joint data offset
blockptr += 4;
for (i = 0; i < num; i++)
dataoffset.Add(getdword(reader.ReadBytes(4)) + blockoffset);
//fseek( fnsbca, 16 * num, SEEK_CUR ); // skip names
blockptr += 16 * num;
for (i = 0; i < num; i++) {
reader.BaseStream.Seek(dataoffset[i], SeekOrigin.Begin);
//j = getdword();
if (reader.ReadBytes(4) == new byte[] { 0x4A, 0x00, 0x41, 0x43 }){ return null; }
blockptr += 4;
animlen.Add(getword(reader.ReadBytes(2)));
objnum = getword(reader.ReadBytes(2));
//if (objnum != g_model[0].objnum){ return NULL; }
blockptr += 4;
//animation = (ANIMATION*)calloc(sizeof(ANIMATION), objnum);
//if (!animation){ return NULL; }
animation = new NSBMDAnimation[objnum];
reader.BaseStream.Seek(4, SeekOrigin.Current); // skip 4 zeros
blockptr += 4;
sec1offset = getdword(reader.ReadBytes(4)) + dataoffset[i];
sec2offset = getdword(reader.ReadBytes(4)) + dataoffset[i];
blockptr += 8;
for (j = 0; j < objnum; j++) {
animation[j] = new NSBMDAnimation();
animation[j].dataoffset = getword(reader.ReadBytes(2)) + dataoffset[i];
}
for (j = 0; j < objnum; j++) {
NSBMD.NSBMDAnimation anim = animation[j];
r = getdword(reader.ReadBytes(4));
anim.flag = r;
// if ((r >> 1 & 1) == 0)
//{ // any transformation?
if ((r >> 1 & 1) == 0) { // translation
if ((r & 4) == 1) { // use Base T
} else {
if ((r & 8) == 1) { // consTX
anim.m_trans[0] = ((float)getdword(reader.ReadBytes(4))) / 4096.0f;
} else {
}
if ((r & 0x10) == 1) { // consTY
anim.m_trans[1] = ((float)getdword(reader.ReadBytes(4))) / 4096.0f;
} else {
}
if ((r & 0x20) == 1) { // consTZ
anim.m_trans[0] = ((float)getdword(reader.ReadBytes(4))) / 4096.0f;
} else {
}
}
}
if ((r >> 6 & 1) == 0) { // rotation
if ((r & 0x100) == 1) { // constR
anim.a = ((float)getword(reader.ReadBytes(2))) / 4096.0f;
anim.b = ((float)getword(reader.ReadBytes(2))) / 4096.0f;
} else {
}
}
if ((r >> 9 & 1) == 0) { // scale
if ((r & 0x400) == 1) { // use Base S
} else {
if ((r & 0x800) == 1) { // consSX
anim.m_scale[0] = ((float)getdword(reader.ReadBytes(4))) / 4096.0f;
} else {
}
if ((r & 0x1000) == 1) {// consSY
anim.m_scale[0] = ((float)getdword(reader.ReadBytes(4))) / 4096.0f;
} else {
}
if ((r & 0x2000) == 1) {// consSZ
anim.m_scale[0] = ((float)getdword(reader.ReadBytes(4))) / 4096.0f;
} else {
}
}
// }
}
animation[j] = anim;
}
}
reader.Close();
//free(dataoffset);
return animation;
}
static Int32 getdword(byte[] b) {
Int32 v;
v = b[0];
v |= b[1] << 8;
v |= b[2] << 16;
v |= b[3] << 24;
return v;
}
static Int32 getword(byte[] b) {
Int32 v;
v = b[0];
v |= b[1] << 8;
return v;
}
#endregion Methods
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/MTX44.cs
================================================
// 4x4 matrix class.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
using System.Diagnostics;
namespace LibNDSFormats.NSBMD {
///
/// 4x4 matrix class.
///
internal class MTX44 {
#region Fields (1)
///
/// Float values of matrix.
///
private float[] _array = new float[4 * 4];
#endregion Fields
#region Properties (2)
// TODO: Index check!
///
/// 2-dimensional index accessor.
///
public float this[int x, int y] {
get { return _array[x + y * 4]; }
set { _array[x + y * 4] = value; }
}
public void SetValues(float[] array) {
this._array = array;
}
///
/// Index accessor.
///
public float this[int index] {
get { return _array[index]; }
set { _array[index] = value; }
}
#endregion Properties
#region Methods (8)
// Public Methods (7)
///
/// Get float array.
///
public float[] Floats {
get {
return _array;
}
}
///
/// Clone this matrix.
///
/// Clone of matrix.
public MTX44 Clone() {
var clone = new MTX44();
for (var i = 0; i < 4 * 4; ++i) {
clone._array[i] = _array[i];
}
return clone;
}
public void translate(float x, float y, float z) {
MTX44 b = new MTX44();
b.LoadIdentity();
b[12] = x;
b[13] = y;
b[14] = z;
MultMatrix(b).CopyValuesTo(this);
}
///
/// Load identity.
///
public void LoadIdentity() {
Zero();
this[0, 0] =
this[1, 1] =
this[2, 2] =
this[3, 3] = 1.0f;
}
///
/// Multiplicate this matrix with another.
///
/// Other matrix.
/// Multiplication result.
public MTX44 MultMatrix(MTX44 b) {
MTX44 m = new MTX44();
MTX44 a = this;
int i, j, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
m._array[(i << 2) + j] = 0.0f;
for (k = 0; k < 4; k++)
m._array[(i << 2) + j] += a._array[(k << 2) + j] * b._array[(i << 2) + k];
}
}
return m;
}
public static MTX44 mtx_Rotate(int pivot, int neg, float a, float b) {
float[] data = new float[16];
data[15] = 1.0F;
float one = 1.0F;
float a2 = a;
float b2 = b;
switch (neg) {
case 1: // '\001'
case 3: // '\003'
case 5: // '\005'
case 7: // '\007'
case 9: // '\t'
case 11: // '\013'
case 13: // '\r'
case 15: // '\017'
one = -1F;
// fall through
goto case 2;
case 2: // '\002'
case 4: // '\004'
case 6: // '\006'
case 8: // '\b'
case 10: // '\n'
case 12: // '\f'
case 14: // '\016'
default:
switch (neg) {
case 2: // '\002'
case 3: // '\003'
case 6: // '\006'
case 7: // '\007'
case 10: // '\n'
case 11: // '\013'
case 14: // '\016'
case 15: // '\017'
b2 = -b2;
// fall through
goto case 4;
case 4: // '\004'
case 5: // '\005'
case 8: // '\b'
case 9: // '\t'
case 12: // '\f'
case 13: // '\r'
default:
switch (neg) {
case 4: // '\004'
case 5: // '\005'
case 6: // '\006'
case 7: // '\007'
case 12: // '\f'
case 13: // '\r'
case 14: // '\016'
case 15: // '\017'
a2 = -a2;
// fall through
goto case 8;
case 8: // '\b'
case 9: // '\t'
case 10: // '\n'
case 11: // '\013'
default:
switch (pivot) {
case 0: // '\0'
data[0] = one;
data[5] = a;
data[6] = b;
data[9] = b2;
data[10] = a2;
break;
case 1: // '\001'
data[1] = one;
data[4] = a;
data[6] = b;
data[8] = b2;
data[10] = a2;
break;
case 2: // '\002'
data[2] = one;
data[4] = a;
data[5] = b;
data[8] = b2;
data[9] = a2;
break;
case 3: // '\003'
data[4] = one;
data[1] = a;
data[2] = b;
data[9] = b2;
data[10] = a2;
break;
case 4: // '\004'
data[5] = one;
data[0] = a;
data[2] = b;
data[8] = b2;
data[10] = a2;
break;
case 5: // '\005'
data[6] = one;
data[0] = a;
data[1] = b;
data[8] = b2;
data[9] = a2;
break;
case 6: // '\006'
data[8] = one;
data[1] = a;
data[2] = b;
data[5] = b2;
data[6] = a2;
break;
case 7: // '\007'
data[9] = one;
data[0] = a;
data[2] = b;
data[4] = b2;
data[6] = a2;
break;
case 8: // '\b'
data[10] = one;
data[0] = a;
data[1] = b;
data[4] = b2;
data[5] = a2;
break;
case 9: // '\t'
data[0] = -a;
break;
}
break;
}
break;
}
break;
}
MTX44 matr = new MTX44();
matr._array = data;
return matr;
}
///
/// Multiplicate this matrix with vector.
///
/// Vector.
/// Multiplication result.
public float[] MultVector(float[] v) {
/* MTX44 a = this;
float[] dest = new float[3];
float x = v[0];
float y = v[1];
float z = v[2];
dest[0] = x*a[(0 << 2) + 0] + y*a[(1 << 2) + 0] + z*a[(2 << 2) + 0] + a[(3 << 2) + 0];
dest[1] = x*a[(0 << 2) + 1] + y*a[(1 << 2) + 1] + z*a[(2 << 2) + 1] + a[(3 << 2) + 1];
dest[2] = x*a[(0 << 2) + 2] + y*a[(1 << 2) + 2] + z*a[(2 << 2) + 2] + a[(3 << 2) + 2];
return dest;*/
float[] vtxTrans = new float[3];
for (int i = 0; i < 3; i++) {
float c0 = v[0] * this[0 + i];
float c1 = v[1] * this[4 + i];
float c2 = v[2] * this[8 + i];
float c3 = this[12 + i];
vtxTrans[i] = c0 + c1 + c2 + c3;
}
return vtxTrans;
}
public MTX44() {
this.LoadIdentity();
}
///
/// Scale this matrix.
///
/// X scale factor.
/// Y scale factor.
/// Z scale factor.
public void Scale(float x, float y, float z) {
MTX44 m = new MTX44();
m.LoadIdentity();
m[0] = x;
m[5] = y;
m[10] = z;
this.MultMatrix(m).CopyValuesTo(this);
}
///
/// Fill matrix with zeroes.
///
public void Zero() {
for (int i = 0; i < 4 * 4; ++i)
_array[i] = 0f;
_array = new float[4 * 4];
}
///
/// Copy values to another matrix.
///
/// Other matrix.
public void CopyValuesTo(MTX44 m) {
for (int i = 0; i < 4 * 4; ++i)
m._array[i] = this[i];
}
#endregion Methods
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMD.cs
================================================
// NSBMD data definition.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using LibNDSFormats.NSBTX;
using System.Drawing;
namespace LibNDSFormats.NSBMD {
// Class for storing NSBMD data.
// Adapted from kiwi.ds NSBMD viewer.
public class NSBMD {
#region Constants
public const uint NDS_TYPE_MDL0 = 0x304c444d;
public const uint NDS_TYPE_TEX0 = 0x30584554;
public const uint NDS_TYPE_BMD0 = 0x30444d42;
public const ushort NDS_TYPE_BYTEORDER = 0xfeff;
public const ushort NDS_TYPE_UNK2 = 0x0002;
public const ushort NDS_TYPE_UNK1 = 0x0001;
public const uint NDS_TYPE_BTX0 = 0x30585442;
public const ushort HEADERSIZE = 16;
#endregion Constants
///
/// Models in NSBMD.
///
public NSBMDModel[] models;
///
/// Materials in NSBMD.
///
public IEnumerable materials;
///
/// NSBMD materials.
///
public List Textures = new List();
///
/// NSBMD materials.
///
public List Palettes = new List();
///
/// Match up model / NSBMD textures.
///
public void MatchTextures() {
foreach (NSBMDModel m in models) {
for (int j = 0; j < m.Polygons.Count - 1; j++) {
for (int t = 0; t < m.Textures.Count; t++) {
if (m.Textures[t].texmatid.Contains((uint)m.Polygons[j].MatId)) {
int texid = t;
for (int l = 0; l < Textures.Count; l++) {
if (Textures[l].texname == m.Textures[t].texname) {
texid = l;
break;
}
}
NSBMDMaterial mat = m.Materials[m.Polygons[j].MatId];
NSBMDTexture tex = Textures[texid];
mat.spdata = tex.spdata; //RITORNA QUI
mat.texdata = tex.texdata;
mat.texname = tex.texname;
mat.texoffset = tex.texoffset;
mat.texsize = tex.texsize;
mat.width = tex.width;
mat.height = tex.height;
mat.format = tex.format;
mat.color0 = tex.color0;
break;
}
}
if (m.Materials[m.Polygons[j].MatId].format != 7) {
for (int k = 0; k < m.Palettes.Count; k++) {
if (m.Palettes[k].palmatid.Contains((uint)m.Polygons[j].MatId)) {
int palid = k;
for (int l = 0; l < Palettes.Count; l++) {
if (Palettes[l].palname == m.Palettes[k].palname) {
palid = l;
break;
}
}
NSBMDMaterial mat = m.Materials[m.Polygons[j].MatId];
NSBMDPalette pal = Palettes[palid];
mat.paldata = pal.paldata;
mat.palname = pal.palname;
mat.paloffset = pal.paloffset;
mat.palsize = pal.palsize;
break;
}
}
}
}
}
}
///
/// Match up model / NSBMD textures.
///
public void MatchTextures_org() {
for (var i = 0; i < models.Length; i++) {
for (var j = 0; j < models[i].Materials.Count; j++) {
/*bool gottex = false;
bool gotpal = false;
foreach (var mat1 in materials)
{
if (j >= models[i].Materials.Count)
continue;
var mat2 = models[i].Materials[j];
// match texture
if (!gottex && mat1.texname.Equals(mat2.texname))
{
//Console.WriteLine("tex '{0}' matched.", mat2.texname);
mat1.CopyTo(mat2);
gottex = true;
}
// match palette
if (mat2.format != 7 // NB. direct texture has no palette
&& !gotpal
&& (mat1.palname).Equals(mat2.palname))
{
//Console.WriteLine("pal '{0}' matched.", mat1.palname);
mat2.palname = mat1.palname;
mat2.palsize = mat1.palsize;
mat2.paldata = mat1.paldata;
//mat1->palsize = 0;
gotpal = true;
}
}*/
try
{
if (materials.ToArray()[models[i].tex_mat.IndexOf(j)].format != 0)
{
//Console.WriteLine("Texture {0}:", j.ToString());
//Console.WriteLine("Texture Name: '{0}'", models[i].Materials[j].texname);
//Console.WriteLine("Palette Name: '{0}'", models[i].Materials[j].palname);
string matname = models[i].Materials[j].MaterialName;
models[i].Materials[j] = materials.ToArray()[models[i].tex_mat.IndexOf(j)].CopyTo(models[i].Materials[j]);
models[i].Materials[j].MaterialName = matname;
//if (models[i].Materials[j].format != 7)
{
models[i].Materials[j].paldata = materials.ToArray()[models[i].pal_mat.IndexOf(j)].paldata;
models[i].Materials[j].palname = materials.ToArray()[models[i].pal_mat.IndexOf(j)].palname;
models[i].Materials[j].palsize = materials.ToArray()[models[i].pal_mat.IndexOf(j)].palsize;
//Console.WriteLine("Texture Name: '{0}'", models[i].Materials[j].texname);
//Console.WriteLine("Palette Name: '{0}'", models[i].Materials[j].palname);
}
}
} catch (Exception e) {
}
}
}
/*for (var i = 0; i < models.Length; i++)
{
for (var j = 0; j < models[i].Materials.Count; j++)
{
bool gottex = false;
bool gotpal = false;
foreach (var mat1 in materials)
{
if (j >= models[i].Materials.Count)
continue;
var mat2 = models[i].Materials[j];
// match texture
if (!gottex && mat1.texname.Equals(mat2.texname))
{
//Console.WriteLine("tex '{0}' matched.", mat2.texname);
mat1.CopyTo(mat2);
gottex = true;
}
for (int q = 0; q < materials.ToList().Count; q++)
{
if (mat2.format != 7 // NB. direct texture has no palette
&& !gotpal
&& materials.ToList()[q].palname.Contains(mat2.texname)
&& (mat1.palname).Equals(mat2.palname))
{
//Console.WriteLine("pal '{0}' matched.", materials.ToArray()[q].palname);
mat2.palname = materials.ToArray()[q].palname;
mat2.palsize = materials.ToArray()[q].palsize;
mat2.paldata = materials.ToArray()[q].paldata;
//mat1->palsize = 0;
gotpal = true;
}
}*/
/*// match palette
if (mat2.format != 7 // NB. direct texture has no palette
&& !gotpal
&& (mat1.palname).Equals(mat2.palname))
{
//Console.WriteLine("pal '{0}' matched.", mat1.palname);
mat2.palname = mat1.palname;
mat2.palsize = mat1.palsize;
mat2.paldata = mat1.paldata;
//mat1->palsize = 0;
gotpal = true;
}*/
// models[i].Materials[j] = mat2;
}
public void ClearTextures() {
foreach (NSBMDModel m in models) {
m.Materials.Clear();
}
}
///
/// Decode objects.
///
public static bool DecodeCode(Stream stream, uint codeoffset, uint codelimit, NSBMDModel mod, int maxstack) {
var reader = new BinaryReader(stream);
//Console.WriteLine("DecodeCode");
UInt32 codeptr = codeoffset;
bool begin = false; // whether there is a 0x0b begin code
int count = 0;
int stackID = -1;
int polyStack = -1;
int polystack2 = -1;
int curjoint = -1;
int matid = -1;
int emptystack = maxstack - 1;
stream.Seek(codeoffset, SeekOrigin.Begin);
while (codeptr < codelimit) {
int c = reader.ReadByte();
//Console.WriteLine(BitConverter.ToString(new byte[] { (byte)c }, 0, 1));
int d, e, f, g, h, i, j, k;
switch (c) {
////////////////////////////////////////////
// bone-definition related byte
case 0x06: //NodeDesc[000]
d = reader.ReadByte();
e = reader.ReadByte();
f = reader.ReadByte(); // dummy '0'
// printf("DEBUG: %08x: 06: %02x --> %02x\n", codeptr, d, e);
codeptr += 4;
//curjoint = d;
mod.Objects[d].ParentID = e;
mod.Objects[d].StackID = stackID = polystack2 = emptystack = emptystack + 1;//stackID + 1;//-1;
mod.Objects[d].RestoreID = -1;
break;
case 0x26: //NodeDesc[001]
d = reader.ReadByte();
e = reader.ReadByte();
f = reader.ReadByte(); // dummy '0'
g = reader.ReadByte(); // store stackID
// printf("DEBUG: %08x: %02x: %02x --> %02x\n", codeptr, c, d, e);
codeptr += 5;
//curjoint = d;
mod.Objects[d].ParentID = e;
mod.Objects[d].StackID = stackID = polystack2 = g;
mod.Objects[d].RestoreID = -1;
break;
case 0x46: // 4 bytes follow
d = reader.ReadByte();
e = reader.ReadByte();
f = reader.ReadByte(); // dummy '0'
g = reader.ReadByte(); // restore stackID
// printf("DEBUG: %08x: %02x: %02x --> %02x\n", codeptr, c, d, e);
codeptr += 5;
//curjoint = d;
mod.Objects[d].ParentID = e;
mod.Objects[d].StackID = stackID = polystack2 = emptystack = emptystack + 1; //stackID + 1;
mod.Objects[d].RestoreID = stackID = g;
break;
case 0x66: //NodeDesc[011]
d = reader.ReadByte();
e = reader.ReadByte();
f = reader.ReadByte(); // dummy '0'
g = reader.ReadByte(); // store stackID
h = reader.ReadByte(); // restore stackID
// printf("DEBUG: %08x: 66: %02x --> %02x\n", codeptr, d, e);
codeptr += 6;
//curjoint = d;
mod.Objects[d].ParentID = e;
mod.Objects[d].StackID = stackID = polystack2 = g;
mod.Objects[d].RestoreID = h;
break;
////////////////////////////////////////////
// node's visibility
case 0x02: //Node
d = reader.ReadByte(); // node ID
e = reader.ReadByte(); // 1 = visible, 0 = hide
curjoint = d;
//polystack2 = mod.Objects[d].StackID;
mod.Objects[d].visible = e == 1;
// printf( "DEBUG: %08x: %02x\n", codeptr, c );
codeptr += 3;
break;
////////////////////////////////////////////
// stackID for polygon
case 0x03: //Mtx
polyStack = reader.ReadByte();
codeptr += 2;
break;
////////////////////////////////////////////
// unknown
case 0x07://NodeDesc_BB[000]
d = reader.ReadByte();
mod.Objects[d].isBillboard = true;
// printf( "DEBUG: %08x: %02x\n", codeptr, c );
codeptr += 2;
break;
case 0x08:
d = reader.ReadByte();
mod.Objects[d].isBillboard = true;
mod.Objects[d].isYBillboard = true;
// printf( "DEBUG: %08x: %02x\n", codeptr, c );
codeptr += 2;
break;
case 0x09://NodeMix[000] Weight
d = reader.ReadByte();
polyStack = d;
e = reader.ReadByte();
codeptr += 2;
for (int l = 0; l < e; l++) {
int var0 = reader.ReadByte();
int var1 = reader.ReadByte();
int var2 = reader.ReadByte() & 0xff;
codeptr += 3;
}
codeptr += 1;
break;
////////////////////////////////////////////
// look like BEGIN and END pair
case 0x0b: // 0 byte follows
if (begin) {
//printf("DEBUG: %08x: previous 0x0b not ended.", codeptr);
}
begin = true;
// printf( "DEBUG: %08x: %02x\n", codeptr, c );
codeptr++;
break;
case 0x2b: // 0 byte follows
if (!begin) {
//printf( "DEBUG: %08x: previous 0x0b already ended.", codeptr );
}
begin = false;
// printf( "DEBUG: %08x: %02x\n", codeptr, c );
codeptr++;
break;
////////////////////////////////////////////
case 0x04: //Mat[000]
case 0x24:
case 0x44:
matid = reader.ReadByte();
codeptr += 2;
count++;
break;
case 0x05://Shp
d = reader.ReadByte();
mod.Polygons[d].MatId = matid;
if (polyStack != -1) {
mod.Polygons[d].StackID = polyStack;
} else {
mod.Polygons[d].StackID = polystack2;
}
mod.Polygons[d].JointID = curjoint;
mod.Objects[curjoint].childs.Add(d);
matid = -1;
codeptr += 2;
break;
case 0x0C://EnvMap
d = reader.ReadByte();
mod.Materials[d].isEnvironmentMap = true;
codeptr += 2;
break;
////////////////////////////////////////////
case 0x01: //Ret
// printf( "DEBUG: %08x: %02x\n", codeptr, c );
codeptr++;
return true;
case 0x00://padding
//codeptr++;
break;
default:
// TODO
//printf( "DEBUG: %08x: decodecode: unknown code %02x.\n", codeptr, c );
//getchar();
return false;
}
}
return false;
}
///
/// ReadMld0.
///
private static NSBMDModel[] ReadMdl0(Stream stream, int blockoffset) {
var reader = new EndianBinaryReader(stream, Endianness.LittleEndian);
int blocksize;
int blockptr;
int blocklimit;
byte num;
uint r;
List model = new List();
////////////////////////////////////////////////
// model
blockptr = blockoffset + 4; // already read the ID, skip 4 bytes
blocksize = reader.ReadInt32(); // block size
blocklimit = blocksize + blockoffset;
stream.Skip(1); // skip dummy '0'
num = reader.ReadByte(); // no of model
if (num <= 0) {
throw new Exception();
}
for (var i = 0; i < num; ++i) {
model.Add(new NSBMDModel());
}
var modelOffset = new UInt32[num];
stream.Skip(10 + 4 + (num * 4)); // skip [char xyz], useless, go straight to model data offset
////////////////////////////////////////////////
// copy model dataoffset
for (var i = 0; i < num; i++) {
modelOffset[i] = (uint)(reader.ReadUInt32() + blockoffset);
}
////////////////////////////////////////////////
// copy model names
for (var i = 0; i < num; i++) {
model[i].Name = Utils.ReadNSBMDString(reader);
}
////////////////////////////////////////////////
// parse model data
uint totalsize_base = reader.ReadUInt32();
uint codeoffset_base = reader.ReadUInt32();
uint texpaloffset_base = reader.ReadUInt32();
uint polyoffset_base = reader.ReadUInt32();
uint polyend_base = reader.ReadUInt32();
stream.Skip(4);
uint matnum = reader.ReadByte(); // no. of material
uint polynum = reader.ReadByte(); // no. of polygon
byte laststack = reader.ReadByte();
byte unknown1m = reader.ReadByte();
float modelscale = (float)reader.ReadInt32() / 4096f;
float boundscale = (float)reader.ReadInt32();// / 4096f;
int vertexcount = reader.ReadInt16();
int surfacecount = reader.ReadInt16();
int trianglecount = reader.ReadInt16();
int quadcount = reader.ReadInt16();
model[0].laststackid = laststack;
model[0].modelScale = modelscale;
model[0].boundScale = boundscale;
model[0].boundXmin = (float)NSBMDGlRenderer.Sign(reader.ReadInt16(), 16) / 4096f;
model[0].boundYmin = (float)NSBMDGlRenderer.Sign(reader.ReadInt16(), 16) / 4096f;
model[0].boundZmin = (float)NSBMDGlRenderer.Sign(reader.ReadInt16(), 16) / 4096f;
model[0].boundXmax = (float)NSBMDGlRenderer.Sign(reader.ReadInt16(), 16) / 4096f;
model[0].boundYmax = (float)NSBMDGlRenderer.Sign(reader.ReadInt16(), 16) / 4096f;
model[0].boundZmax = (float)NSBMDGlRenderer.Sign(reader.ReadInt16(), 16) / 4096f;
var polyOffsets = new UInt32[polynum];
var polyDataSize = new UInt32[polynum];
for (int i = 0; i < 1; i++) {
var mod = model[i];
stream.Seek(modelOffset[i], SeekOrigin.Begin);
uint codeoffset;
UInt32 texpaloffset;
UInt32 polyoffset;
long texoffset;
long paloffset;
uint modoffset = modelOffset[i];
// the following variables are all offset values
long totalsize = totalsize_base + modoffset;
codeoffset = codeoffset_base + modoffset;
// additional model data, bone definition etc., just follow NsbmdObject section
texpaloffset = texpaloffset_base + modoffset;
polyoffset = polyoffset_base + modoffset;
long polyend = polyend_base + modoffset;
stream.Skip(5 * 4 + 4 + 2 + 38); // go straight to NsbmdObject
////////////////////////////////////////////////
// NsbmdObject section
uint objnum;
int objdatabase;
uint[] objdataoffset;
uint[] objdatasize;
objdatabase = (int)stream.Position;
stream.Skip(1); // skip dummy '0'
objnum = reader.ReadByte(); // no of NsbmdObject
stream.Skip(14 + (objnum * 4)); // skip bytes, go striaght to NsbmdObject data offset
for (i = 0; i < objnum; ++i) {
mod.Objects.Add(new NSBMDObject());
}
objdataoffset = new uint[objnum];
objdatasize = new uint[objnum];
for (var j = 0; j < objnum; j++) {
objdataoffset[j] = (uint)(reader.ReadUInt32() + objdatabase);
}
for (var j = 0; j < objnum - 1; j++) {
objdatasize[j] = objdataoffset[j + 1] - objdataoffset[j];
}
objdatasize[objnum - 1] = (uint)(codeoffset - objdataoffset[objnum - 1]);
////////////////////////////////////////////////
// copy NsbmdObject names
for (var j = 0; j < objnum; j++) {
mod.Objects[j].Name = Utils.ReadNSBMDString(reader);
// TO DEBUG
Console.WriteLine(mod.Objects[j].Name);
}
////////////////////////////////////////////////
// parse NsbmdObject information
for (var j = 0; j < objnum; j++) {
if (objdatasize[j] <= 4) {
continue;
}
stream.Seek(objdataoffset[j], SeekOrigin.Begin);
ParseNsbmdObject(reader, mod.Objects[j], modelscale);
}
////////////////////////////////////////////////
// material section
stream.Seek(texpaloffset, SeekOrigin.Begin); // now get the texture and palette offset
texoffset = reader.ReadUInt16() + texpaloffset;
paloffset = reader.ReadUInt16() + texpaloffset;
// allocate memory for material
for (int j = 0; j <= matnum; j++) {//i <= matnum; ++i
mod.Materials.Add(new NSBMDMaterial());
}
////////////////////////////////////////////////
// parse material definition
// defines RotA material by pairing texture and palette
stream.Seek(16 + (matnum * 4), SeekOrigin.Current); // go straight to material data offset
for (var j = 0; j < matnum; j++) // TODO: BAD!
{
mod.Materials[j] = new NSBMDMaterial();
blockptr = (int)stream.Position;
r = reader.ReadUInt32() + texpaloffset/* + 4 + 12*/;// skip 18 bytes (+ 2 bytes for texoffset, 2 bytes for paloffset)
stream.Seek(r, SeekOrigin.Begin);
//mod.Materials[j].repeat = reader.ReadByte();
//reader.BaseStream.Position -= 1;
int dummy = reader.ReadInt16();
int sectionSize = reader.ReadInt16();
int unknown1 = reader.ReadInt32();//DifAmbColors
int unknown2 = reader.ReadInt32();//SpeEmiColors
int unknown3 = reader.ReadInt32();//PolyAttrib
int constant2 = reader.ReadInt32();//PolyAttrib Mask
int texVramOffset = reader.ReadInt16();
int texImageParam = reader.ReadInt16();
int constant3 = reader.ReadInt32();//texImageParam Mask
int constant4 = reader.ReadInt32();
int matWidth = reader.ReadInt16();
int matHeight = reader.ReadInt16();
int unknown4 = reader.ReadInt16();
int unknown5 = reader.ReadInt16();
int unknown6 = reader.ReadInt32();
//int unknown7 = reader.ReadInt32();//if srt S Scale
//int unknown8 = reader.ReadInt32();//if srt T Scale
//int unknown9 = reader.ReadInt16();//if srt & 60 Rot
//int unknownA = reader.ReadInt16();//if srt & 60 S Trans
//int unknownB = reader.ReadInt16();//if srt & 60 T Trans
//uint polyParam = reader.ReadUInt32();
//reader.ReadInt16();
//ushort texImageParam = reader.ReadUInt16();
mod.Materials[j].repeatS = texImageParam & 1;
mod.Materials[j].repeatT = texImageParam >> 1 & 1;
mod.Materials[j].flipS = texImageParam >> 2 & 1;
mod.Materials[j].flipT = texImageParam >> 3 & 1;
/*if ((texImageParam >> 14 & 0x03) == 1)
{
mod.Materials[j].scaleS = /*1 << /(texImageParam >> 12 & 2) + 1;
mod.Materials[j].scaleT = /*1 << /(texImageParam >> 14 & 2) + 1;
}
else
{
mod.Materials[j].scaleS = 1;
mod.Materials[j].scaleT = 1;
}*/
switch (texImageParam >> 14 & 0x03) {
case 0:
mod.Materials[j].scaleS = 1;
mod.Materials[j].scaleT = 1;
mod.Materials[j].transS = 0;
mod.Materials[j].transT = 0;
break;
case 1:
{
int sscale = (int)reader.ReadInt32();// >> 0 & 0xFFFFFFFF;
sscale = NSBMDGlRenderer.Sign(sscale, 32);
int tscale = (int)reader.ReadInt32();// >> 0 & 0xFFFFFFFF;
tscale = NSBMDGlRenderer.Sign(tscale, 32);
//int strans = (int)unknown2 >> 0 & 0xFFFF;
//int ttrans = (int)unknown2 >> 16 & 0xFFFF;
mod.Materials[j].scaleS = (float)sscale / 4096f;
mod.Materials[j].scaleT = (float)tscale / 4096f;
if (sectionSize >= 60) {
mod.Materials[j].rot = (float)reader.ReadInt16() / 4096f;
mod.Materials[j].transS = (float)reader.ReadInt16() / 4096f;
mod.Materials[j].transT = (float)reader.ReadInt16() / 4096f;
} else {
}
break;
}
case 2:
case 3:
mod.Materials[j].mtx = new float[16];
for (int k = 0; k < 16; k++) {
mod.Materials[j].mtx[k] = reader.ReadInt32();
}
break;
default:
break;
// throw new Exception(String.Format("BMD: unsupported texture coord transform mode {0}", matgroup.m_TexParams >> 30));
}
mod.Materials[j].width = matWidth;
mod.Materials[j].height = matHeight;
int width = 8 << (texImageParam >> 4 & 7);
int height = 8 << (texImageParam >> 7 & 7);
//int m_DifAmbColors = reader.ReadInt32();
//int m_SpeEmiColors = reader.ReadInt32();
mod.Materials[j].DiffuseColor = SM64DSe.Helper.BGR15ToColor((ushort)(unknown1 & 0x7FFF));
mod.Materials[j].AmbientColor = SM64DSe.Helper.BGR15ToColor((ushort)(unknown1 >> 16 & 0x7FFF));
mod.Materials[j].SpecularColor = SM64DSe.Helper.BGR15ToColor((ushort)(unknown2 & 0x7FFF));
mod.Materials[j].EmissionColor = SM64DSe.Helper.BGR15ToColor((ushort)(unknown2 >> 16 & 0x7FFF));
int a = (int)((unknown3 >> 16) & 31);
mod.Materials[j].Alpha = a;//a * 2 + 1;//a * 2 + (a + 31) / 32;
mod.Materials[j].PolyAttrib = (uint)unknown3;
mod.Materials[j].diffuseColor = (unknown1 >> 15 & 1) == 1;
mod.Materials[j].shine = (unknown2 >> 15 & 1) == 1;
stream.Seek(blockptr + 4, SeekOrigin.Begin);
}
for (var j = 0; j < matnum; j++) {
mod.Materials[j].MaterialName = Utils.ReadNSBMDString(reader);
}
////////////////////////////////////////////////
// now go to read the texture definition
stream.Seek(texoffset, SeekOrigin.Begin);
stream.Skip(1); // skip dummy '0'
int texnum = reader.ReadByte();
Debug.Assert(texnum <= matnum);
Console.WriteLine(String.Format("texnum: {0}", texnum));
if (texnum > 0) {
stream.Seek(14 + (texnum * 4), SeekOrigin.Current); // go straight to data offsets
for (var j = 0; j < texnum; j++) {
Int32 flags = reader.ReadInt32();
int numPairs = flags >> 16 & 0xf;
int dummy = flags >> 24 & 0xf;
blockptr = (int)stream.Position;
stream.Seek((flags & 0xffff) + texpaloffset, SeekOrigin.Begin);
NSBMDTexture t = new NSBMDTexture();
for (int k = 0; k < numPairs; k++) {
uint texmatid = reader.ReadByte();
mod.tex_mat.Add((int)texmatid);
mod.Materials[j].texmatid.Add(texmatid);
t.texmatid.Add(texmatid);
}
mod.Textures.Add(t);
stream.Seek(blockptr, SeekOrigin.Begin);
}
for (var j = 0; j < texnum; j++) // copy texture names
{
NSBMDMaterial mat = mod.Materials[j];
mat.texname = Utils.ReadNSBMDString(reader);
reader.BaseStream.Position -= 16;
mod.Textures[j].texname = Utils.ReadNSBMDString(reader);
Console.WriteLine("tex (matid={0}): {1}", mat.texmatid, mat.texname);
}
}
////////////////////////////////////////////////
// now go to read the palette definition
stream.Seek(paloffset, SeekOrigin.Begin);
stream.Skip(1); // skip dummy '0'
int palnum = reader.ReadByte(); // no of palette definition
Debug.Assert(palnum <= matnum); // may not always hold?
Console.WriteLine("DEBUG: palnum = {0}", palnum);
if (palnum > 0) {
stream.Seek(14 + (palnum * 4), SeekOrigin.Current); // go straight to data offsets
for (var j = 0; j < palnum; j++) // matching palette with material
{
Int32 flags = reader.ReadInt32();
int numPairs = flags >> 16 & 0xf;
int dummy = flags >> 24 & 0xf;
blockptr = (int)stream.Position;
stream.Seek((flags & 0xffff) + texpaloffset, SeekOrigin.Begin);
NSBMDPalette t = new NSBMDPalette();
for (int k = 0; k < numPairs; k++) {
uint texmatid = reader.ReadByte();
mod.tex_mat.Add((int)texmatid);
mod.Materials[j].texmatid.Add(texmatid);
t.palmatid.Add(texmatid);
}
mod.Palettes.Add(t);
stream.Seek(blockptr, SeekOrigin.Begin);
}
for (var j = 0; j < palnum; j++) // copy palette names
{
int palmatid = (int)mod.Materials[j].palmatid;
mod.Materials[palmatid].palname = Utils.ReadNSBMDString(reader);
reader.BaseStream.Position -= 16;
mod.Palettes[j].palname = Utils.ReadNSBMDString(reader);
// TO DEBUG
//Console.WriteLine("pal (matid={0}): {1}", palmatid, mod.Materials[palmatid].palname);
}
}
////////////////////////////////////////////////
// Polygon
stream.Seek(polyoffset, SeekOrigin.Begin);
stream.Skip(1); // skip dummy '0'
r = reader.ReadByte(); // no of polygon
Console.WriteLine("DEBUG: polynum = {0}", polynum);
for (var j = 0; j <= polynum; j++) {
mod.Polygons.Add(new NSBMDPolygon());
}
stream.Skip(14 + (polynum * 4)); // skip bytes, go straight to data offset
for (var j = 0; j < polynum; j++)
polyOffsets[j] = reader.ReadUInt32() + polyoffset;
try {
for (var j = 0; j < polynum; j++) // copy polygon names
{
mod.Polygons[j].Name = Utils.ReadNSBMDString(reader);
//Console.WriteLine(mod.Polygons[j].Name);
}
} catch { }
////////////////////////////////////////////////
// now go to the polygon data, there is RotA 16-byte-header before geometry commands
for (var j = 0; j < polynum; j++) {
var poly = mod.Polygons[j];
//////////////////////////////////////////////////////////
poly.MatId = -1; // DEFAULT: indicate no associated material
//////////////////////////////////////////////////////////
//stream.Seek(polyOffsets[j] + 8, SeekOrigin.Begin); // skip 8 unknown bytes
short dummy = reader.ReadInt16();
short headerSize = reader.ReadInt16();
int unknown2 = reader.ReadInt32();
polyOffsets[j] += reader.ReadUInt32();
polyDataSize[j] = reader.ReadUInt32();
//printf( "poly %2d '%-16s': dataoffset: %08x datasize %08x\n", j, poly->polyname, poly->dataoffset, poly->datasize );
}
//}
////////////////////////////////////////////////
// read the polygon data into memory
for (var j = 0; j < polynum; j++) {
var poly = mod.Polygons[j];
stream.Seek(polyOffsets[j], SeekOrigin.Begin);
poly.PolyData = reader.ReadBytes((int)polyDataSize[j]);
}
//}
////////////////////////////////////////////////
// decode the additional model data
DecodeCode(stream, codeoffset, texpaloffset, mod, laststack);
}
//modelnum = num;
return model.ToArray();
}
public static float getFixed(int value, int sign, int var, int frac) {
float fixe = value;
if (sign == 1) {
fixe = NSBMDGlRenderer.Sign(value, GetSizeOfObject(value));
}
float divide = 1 << frac;
fixe /= divide;
return fixe;
}
public static int GetSizeOfObject(object obj) {
if (obj is Int32) {
return 32;
}
if (obj is Int16) {
return 16;
}
if (obj is byte) {
return 8;
}
return -1;
}
///
/// Parse single NSBMD object.
///
private static void ParseNsbmdObject(EndianBinaryReader reader, NSBMDObject nsbmdObject, float modelscale) {
ushort v = reader.ReadUInt16();
Int16 divide = reader.ReadInt16();
divide = (short)NSBMDGlRenderer.Sign(divide, 16);
int unknown = v >> 12 & 0xf;
nsbmdObject.StackID = unknown;
//nsbmdObject.isBillboard = ((v >> 12 & 0xf) == 1?true:false);
float[] s = NSBMDGlRenderer.loadIdentity();
float[] r = NSBMDGlRenderer.loadIdentity();
float[] t = NSBMDGlRenderer.loadIdentity();
if ((v & 1) == 0) {
nsbmdObject.Trans = true;
nsbmdObject.X = (float)reader.ReadInt32() / 4096f / modelscale;//(float)getdword(reader.ReadBytes(4)) / 4096f; //(float)(reader.ReadDouble() / 4096d);//.ReadUInt32() / 4096;
nsbmdObject.Y = (float)reader.ReadInt32() / 4096f / modelscale;//(float)getdword(reader.ReadBytes(4)) / 4096f;//(float)(reader.ReadDouble() / 4096d);
nsbmdObject.Z = (float)reader.ReadInt32() / 4096f / modelscale;//(float)getdword(reader.ReadBytes(4)) / 4096f;//(float)(reader.ReadDouble() / 4096d);
t = NSBMDGlRenderer.Translate(t, nsbmdObject.X, nsbmdObject.Y, nsbmdObject.Z);
}
if ((v >> 3 & 0x1) == 0x1) {
nsbmdObject.IsRotated = true;
float a = reader.ReadInt16();
a = NSBMDGlRenderer.Sign((int)a, 16) / 4096f;
float b = reader.ReadInt16();
b = NSBMDGlRenderer.Sign((int)b, 16) / 4096f;
nsbmdObject.Pivot = (int)(v >> 4) & 0x0f;
nsbmdObject.Neg = (int)(v >> 8) & 0x0f;
nsbmdObject.RotA = a;
nsbmdObject.RotB = b;
nsbmdObject.rotate_mtx = mtxPivot(new float[] { nsbmdObject.RotA, nsbmdObject.RotB }, nsbmdObject.Pivot, nsbmdObject.Neg);
r = NSBMDGlRenderer.multMatrix(r, nsbmdObject.rotate_mtx);
}
if ((v >> 1 & 1) == 0 && (v >> 3 & 1) == 0) {
float[] a = new float[16];
a[0] = 1.0F;
a[5] = 1.0F;
a[10] = 1.0F;
a[15] = 1.0F;
float[] rotate = new float[8];
//msg = (new StringBuilder()).append(msg).append(" | R: ").toString();
for (int j = 0; j < rotate.Length; j++) {
//dataParser _tmp4 = pa;
int value = NSBMDGlRenderer.Sign(reader.ReadInt16(), 16); //dataParser.getSign(data, offset + 4 + j * 2 + jump, 2);
rotate[j] = (float)value / 4096f;
//msg = (new StringBuilder()).append(msg).append(pad(Integer.valueOf(value), 4)).toString();
//if(j + 1 < rotate.length)
// msg = (new StringBuilder()).append(msg).append(", ").toString();
}
a[0] = (float)divide / 4096f;
a[1] = rotate[0];
a[2] = rotate[1];
a[4] = rotate[2];
a[5] = rotate[3];
a[6] = rotate[4];
a[8] = rotate[5];
a[9] = rotate[6];
a[10] = rotate[7];
nsbmdObject.rotate_mtx = a;
nsbmdObject.IsRotated = true;
r = NSBMDGlRenderer.multMatrix(r, nsbmdObject.rotate_mtx);
}
if ((v >> 2 & 1) == 0) {
float[] scale = new float[3];
for (int j = 0; j < scale.Length; j++) {
int value = reader.ReadInt32();
scale[j] = (float)value / 4096f;
}
nsbmdObject.scale = scale;
nsbmdObject.IsScaled = true;
s = NSBMDGlRenderer.scale(s, scale[0], scale[1], scale[2]);
}
nsbmdObject.materix = NSBMDGlRenderer.loadIdentity();
nsbmdObject.materix = NSBMDGlRenderer.multMatrix(nsbmdObject.materix, t);
nsbmdObject.materix = NSBMDGlRenderer.multMatrix(nsbmdObject.materix, r);
nsbmdObject.materix = NSBMDGlRenderer.multMatrix(nsbmdObject.materix, s);
}
public static float[] mtxPivot(float[] ab, int pv, int neg) {
float[] data = new float[16];
data[15] = 1.0F;
float one = 1.0F;
float a = ab[0];
float b = ab[1];
float a2 = a;
float b2 = b;
switch (neg) {
case 1: // '\001'
case 3: // '\003'
case 5: // '\005'
case 7: // '\007'
case 9: // '\t'
case 11: // '\013'
case 13: // '\r'
case 15: // '\017'
one = -1F;
// fall through
goto case 2;
case 2: // '\002'
case 4: // '\004'
case 6: // '\006'
case 8: // '\b'
case 10: // '\n'
case 12: // '\f'
case 14: // '\016'
default:
switch (neg) {
case 2: // '\002'
case 3: // '\003'
case 6: // '\006'
case 7: // '\007'
case 10: // '\n'
case 11: // '\013'
case 14: // '\016'
case 15: // '\017'
b2 = -b2;
// fall through
goto case 4;
case 4: // '\004'
case 5: // '\005'
case 8: // '\b'
case 9: // '\t'
case 12: // '\f'
case 13: // '\r'
default:
switch (neg) {
case 4: // '\004'
case 5: // '\005'
case 6: // '\006'
case 7: // '\007'
case 12: // '\f'
case 13: // '\r'
case 14: // '\016'
case 15: // '\017'
a2 = -a2;
// fall through
goto case 8;
case 8: // '\b'
case 9: // '\t'
case 10: // '\n'
case 11: // '\013'
default:
switch (pv) {
case 0: // '\0'
data[0] = one;
data[5] = a;
data[6] = b;
data[9] = b2;
data[10] = a2;
break;
case 1: // '\001'
data[1] = one;
data[4] = a;
data[6] = b;
data[8] = b2;
data[10] = a2;
break;
case 2: // '\002'
data[2] = one;
data[4] = a;
data[5] = b;
data[8] = b2;
data[9] = a2;
break;
case 3: // '\003'
data[4] = one;
data[1] = a;
data[2] = b;
data[9] = b2;
data[10] = a2;
break;
case 4: // '\004'
data[5] = one;
data[0] = a;
data[2] = b;
data[8] = b2;
data[10] = a2;
break;
case 5: // '\005'
data[6] = one;
data[0] = a;
data[1] = b;
data[8] = b2;
data[9] = a2;
break;
case 6: // '\006'
data[8] = one;
data[1] = a;
data[2] = b;
data[5] = b2;
data[6] = a2;
break;
case 7: // '\007'
data[9] = one;
data[0] = a;
data[2] = b;
data[4] = b2;
data[6] = a2;
break;
case 8: // '\b'
data[10] = one;
data[0] = a;
data[1] = b;
data[4] = b2;
data[5] = a2;
break;
case 9: // '\t'
data[0] = -a;
break;
}
break;
}
break;
}
break;
}
return data;
}
static Int32 getdword(byte[] b) {
Int32 v;
v = b[0];
v |= b[1] << 8;
v |= b[2] << 16;
v |= b[3] << 24;
return v;
}
static Int32 getword(byte[] b) {
Int32 v;
v = b[0];
v |= b[1] << 8;
return v;
}
///
/// Generate NSBMD from stream.
///
internal static NSBMD FromStream(Stream stream) {
var result = new NSBMD();
var reader = new BinaryReader(stream);
int tmp;
tmp = reader.ReadInt32();
if (tmp != NDS_TYPE_BMD0)
throw new Exception();
tmp = reader.ReadUInt16();
if (tmp != NDS_TYPE_BYTEORDER)
throw new Exception();
tmp = reader.ReadUInt16();
if (tmp != NDS_TYPE_UNK2)
throw new Exception();
int filesize = reader.ReadInt32();
if (filesize > stream.Length)
throw new Exception();
int numblock = reader.ReadInt32();
numblock >>= 16;
if (numblock == 0) {
throw new Exception("DEBUG: no of block zero.\n");
}
///////////////////////////////////////////////////////
// allocate memory for storing blockoffset
int[] blockoffset = new int[numblock];
for (int i = 0; i < numblock; i++) {
tmp = reader.ReadInt32();
blockoffset[i] = tmp;
}
///////////////////////////////////////////////////////
// now go to read the blocks
for (int i = 0; i < numblock; i++) {
stream.Position = blockoffset[i];
uint id = reader.ReadUInt32();
switch (id) {
case NDS_TYPE_MDL0:
result.models = ReadMdl0(stream, blockoffset[i]);
break;
case NDS_TYPE_TEX0:
int palnum;
int texnum;
result.materials = NSBTXLoader.ReadTex0(stream, blockoffset[i], out texnum, out palnum, out result.Textures, out result.Palettes);
break;
default:
throw new Exception("Unknown ID");
}
}
return result;
}
}
///
/// Type for storing RGBA data in.
///
public struct RGBA {
#region Data Members (6)
public byte A;
public byte R;
public byte G;
public byte B;
///
/// Transparent color.
///
public static RGBA Transparent = new RGBA { R = 0xFF, A = 0x0 };
public static RGBA fromColor(System.Drawing.Color c) {
RGBA a = new RGBA();
a.R = c.R;
a.G = c.G;
a.B = c.B;
a.A = c.A;
return a;
}
///
/// Index accessor.
///
public byte this[int i] {
get {
switch (i) {
case 0:
return R;
case 1:
return G;
case 2:
return B;
case 3:
return A;
default:
throw new Exception();
}
}
set {
switch (i) {
case 0:
R = value;
break;
case 1:
G = value;
break;
case 2:
B = value;
break;
case 3:
A = value;
break;
default:
throw new Exception();
}
}
}
public Color ToColor() {
return Color.FromArgb(A, R, G, B);
}
#endregion Data Members
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDAnimation.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LibNDSFormats.NSBMD
{
///
/// Type for NSBCA objects.
///
public class NSBMDAnimation
{
public int dataoffset = 0;
public int flag = 0;
public float[] m_trans = new float[3];
public float a, b = 0;
public float[] m_scale = new float[3];
public int frame = 0;
public int framelen = 0;
public List animdata = new List();
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDGlRenderer.cs
================================================
// OpenGL Renderer for NSBMD models.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
using System.Collections.Generic;
using Tao.OpenGl;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using OpenTK;
using HelixToolkit;
using MKDS_Course_Editor.Export3DTools;
namespace LibNDSFormats.NSBMD {
///
/// OpenGL renderer for NSBMD models.
///
public class NSBMDGlRenderer {
#region Fields (11)
private bool writevertex = true;
public List normals = new List();
public List vertex = new List();
List md = new List();
public static DependencyProperty matName = DependencyProperty.Register("MatName", typeof(string), typeof(DiffuseMaterial));
public static DependencyProperty polyName = DependencyProperty.Register("PolyName", typeof(string), typeof(DiffuseMaterial));
List matt = new List();
List mattt = new List();
public List vertex_normal = new List();
private static MTX44 CurrentMatrix;
private static bool g_mat = true;
private static string file;
public static bool gOptColoring = true;
private static bool gOptTexture = true;
private static bool gOptWireFrame = false;
private static MTX44[] MatrixStack = new MTX44[31];
private const float SCALE_IV = 4096.0f;
private static int stackID;
private int[] Tx;
private int[] Ty;
private int[] Tz;
//private int[] T2;
private int[] R;
//private int[] R2;
private int[] Sx;
private int[] Sy;
private int[] Sz;
private int[] S2x;
private int[] S2y;
private int[] S2z;
//private int[] S2;
private int[] frame;
private int[] nr;
private int[] frame_;
//private static int gCurrentPoly;
private static int gCurrentVertex;
private static bool gOptVertexMode;
private int matstart;
private static readonly String[] TEXTURE_FORMATS = new String[] { "", "A3I5", "4-Color", "16-Color", "256-Color", "4x4-Texel", "A5I3", "Direct Texture" };
#endregion Fields
#region Constructors (1)
public NSBMDGlRenderer() {
this.matstart = 0;
// Init matrix stack.
for (int i = 0; i < MatrixStack.Length; ++i)
MatrixStack[i] = new MTX44();
}
///
/// Ctor.
///
public NSBMDGlRenderer(int matstart) {
this.matstart = matstart;
// Init matrix stack.
for (int i = 0; i < MatrixStack.Length; ++i)
MatrixStack[i] = new MTX44();
}
#endregion Constructors
#region Methods (8)
// Public Methods (1)
///
/// Model to render.
///
private NSBMDModel _model;
///
/// Model to render.
///
public NSBMDModel Model {
get { return _model; }
set {
_model = value;
try {
MakeTexture(_model);
} catch {
}
}
}
public enum RenderMode {
Opaque = 1,
Translucent,
Picking
}
public static float[] Rotate(float[] a, float x, float y, float z) {
float[] b = loadIdentity();
float cx = (float)Math.Cos(x);
float sx = (float)Math.Sin(x);
float cy = (float)Math.Cos(y);
float sy = (float)Math.Sin(y);
float cz = (float)Math.Cos(z);
float sz = (float)Math.Sin(z);
b[0] = cy * cz;
b[1] = cy * sz;
b[2] = -sy;
b[4] = cz * sx * sy - sz * cx;
b[5] = sx * sy + cx * cz;
b[6] = sx * cy;
b[8] = cx * cz * sy + sx * sz;
b[9] = cx * sy * sz - sx * cz;
b[10] = cx * cy;
return multMatrix(a, b);
}
int lastselectedanim = -2;
public void RenderModel(string file2, MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File ani, int[] aniframeS, int[] aniframeT, int[] aniframeScaleS, int[] aniframeScaleT, int[] aniframeR, MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File ca, bool anim, int selectedani, float X, float Y, float dist, float elev, float ang, MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File p, NSBMD nsb) {
RenderModel(file2, ani, aniframeS, aniframeT, aniframeScaleS, aniframeScaleT, aniframeR, ca, anim, selectedani, X, Y, dist, elev, ang, true, p, nsb);
}
public void RenderModel(string file2, MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File ani, int[] aniframeS, int[] aniframeT, int[] aniframeScaleS, int[] aniframeScaleT, int[] aniframeR, MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File ca, bool anim, int selectedani, float X, float Y, float dist, float elev, float ang, bool licht, MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File p, NSBMD nsb) {
if (lastselectedanim != selectedani && selectedani != -1) {
Tx = new int[ca.JAC[selectedani].ObjInfo.Length];
Ty = new int[ca.JAC[selectedani].ObjInfo.Length];
Tz = new int[ca.JAC[selectedani].ObjInfo.Length];
R = new int[ca.JAC[selectedani].ObjInfo.Length];
Sx = new int[ca.JAC[selectedani].ObjInfo.Length];
Sy = new int[ca.JAC[selectedani].ObjInfo.Length];
Sz = new int[ca.JAC[selectedani].ObjInfo.Length];
S2x = new int[ca.JAC[selectedani].ObjInfo.Length];
S2y = new int[ca.JAC[selectedani].ObjInfo.Length];
S2z = new int[ca.JAC[selectedani].ObjInfo.Length];
lastselectedanim = selectedani;
}
if (frame is null && p.Header.file_size != 0) {
frame = new int[p.MPT.names.Length];
frame_ = new int[p.MPT.names.Length];
nr = new int[p.MPT.names.Length];
}
RenderModel(file2, ani, aniframeS, aniframeT, aniframeScaleS, aniframeScaleT, aniframeR, ca, RenderMode.Opaque, anim, anim, selectedani, X, Y, dist, elev, ang, licht, p, nsb); //anim, anim);
RenderModel(file2, ani, aniframeS, aniframeT, aniframeScaleS, aniframeScaleT, aniframeR, ca, RenderMode.Translucent, false, anim, selectedani, X, Y, dist, elev, ang, licht, p, nsb);
}
//MTX44[] mt;
///
/// Render model to OpenGL surface.
///
public void RenderModel(string file2, MKDS_Course_Editor.NSBTA.NSBTA.NSBTA_File ani, int[] aniframeS, int[] aniframeT, int[] aniframeScaleS, int[] aniframeScaleT, int[] aniframeR, MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File ca, RenderMode r, bool anim, bool anim2, int selectedanim, float X, float Y, float dist, float elev, float ang, bool licht, MKDS_Course_Editor.NSBTP.NSBTP.NSBTP_File p, NSBMD nsb) {
file = file2;
int light = Gl.glIsEnabled(Gl.GL_LIGHTING);
Gl.glDisable(Gl.GL_LIGHTING);
Gl.glLineWidth(2.0F);
if (light == 1) {
Gl.glEnable(Gl.GL_LIGHTING);
}
Gl.glLineWidth(1.0F);
////////////////////////////////////////////////////////////
// prepare the matrix stack
for (var i = 0; i < Model.Objects.Count; i++) {
var obj = Model.Objects[i];
var m_trans = obj.TransVect;
if (obj.RestoreID != -1) {
Gl.glLoadMatrixf(MatrixStack[obj.RestoreID].Floats);
}
if (obj.StackID != -1) {
if (obj.Trans) {
Gl.glTranslatef(m_trans[0], m_trans[1], m_trans[2]);
}
Gl.glGetFloatv(Gl.GL_MODELVIEW_MATRIX, MatrixStack[obj.StackID].Floats);
stackID = obj.StackID; // save the last stackID
}
}
Gl.glLoadIdentity();
////////////////////////////////////////////////////////////
// display one polygon of the current model at a time
//Todo
////////////////////////////////////////////////////////////
// display all polygons of the current model
for (var i = 0; i < Model.Polygons.Count - 1; i++) {
var poly = Model.Polygons[i];
if (gOptTexture && !gOptWireFrame && g_mat) {
int matid = poly.MatId;
if (matid == -1) {
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
if (writevertex) {
mattt.Add(new ImageBrush());
}
} else {
if (writevertex) {
mattt.Add(matt[matid]);
}
NSBMDMaterial mat = Model.Materials[matid];
if ((mat.format == 0 || (mat.format >= 2 && mat.format <= 5) || mat.format == 7) && r != RenderMode.Opaque) {
continue;
}
if ((mat.format == 1 || mat.format == 6) && r == RenderMode.Translucent) {
continue;
}
Gl.glBindTexture(Gl.GL_TEXTURE_2D, matid + 1 + matstart);
// Convert pixel coords to normalised STs
Gl.glMatrixMode(Gl.GL_TEXTURE);
Gl.glLoadIdentity();
if (p.Header.file_size != 0 ) {
List mptNames = new List(p.MPT.names);
if (mptNames.Contains(mat.MaterialName)) {
NSBMDMaterial mmm = mat;
int texid = 0;
for (int l = 0; l < nsb.Textures.Count; l++) {
if (nsb.Textures[l].texname == p.AnimData[mptNames.IndexOf(mat.MaterialName)].KeyFrames[frame_[mptNames.IndexOf(mat.MaterialName)]].texName) {
texid = l;
break;
}
}
mmm.spdata = nsb.Textures[texid].spdata;
mmm.texdata = nsb.Textures[texid].texdata;
mmm.texname = nsb.Textures[texid].texname;
mmm.texoffset = nsb.Textures[texid].texoffset;
mmm.texsize = nsb.Textures[texid].texsize;
mmm.width = nsb.Textures[texid].width;
mmm.height = nsb.Textures[texid].height;
mmm.format = nsb.Textures[texid].format;
mmm.color0 = nsb.Textures[texid].color0;
int palid = 0;
for (int l = 0; l < nsb.Textures.Count; l++) {
if (nsb.Palettes[l].palname == p.AnimData[mptNames.IndexOf(mat.MaterialName)].KeyFrames[frame_[mptNames.IndexOf(mat.MaterialName)]].palName) {
palid = l;
break;
}
}
mmm.paldata = nsb.Palettes[palid].paldata;
mmm.palname = nsb.Palettes[palid].palname;
mmm.paloffset = nsb.Palettes[palid].paloffset;
mmm.palsize = nsb.Palettes[palid].palsize;
MakeTexture(matid, mmm);
if (anim2) {
int index = mptNames.IndexOf(mat.MaterialName);
if (nr[index] == Math.Round(p.MPT.infoBlock.Data[index].Unknown1 / 512f)) {
nr[index] = 0;
if (frame[index] == p.MPT.NoFrames - 1) {
frame[index] = 0;
frame_[index] = 0;
} else {
frame[index]++;
if (p.AnimData[index].KeyFrames.Length != frame_[index] + 1) {
if (frame[index] == p.AnimData[index].KeyFrames[frame_[index] + 1].Start) {
frame_[index]++;
}
}
}
} else {
nr[index]++;//= (float)p.MPT.infoBlock.Data[index].Unknown1 / 4096f;
}
}
}
}
try {
if (ani.Header.file_size != 0 && new List(ani.MAT.names).Contains(mat.MaterialName)) {
int index = new List(ani.MAT.names).IndexOf(mat.MaterialName);
Gl.glScaled((double)ani.SRTData[index].scaleS[aniframeScaleS[index]], (double)ani.SRTData[index].scaleT[aniframeScaleT[index]], 1);
Gl.glRotated((double)ani.SRTData[index].rotate[aniframeR[index]], 1, 0, 0);
Gl.glTranslated((double)ani.SRTData[index].translateS[aniframeS[index]], (double)ani.SRTData[index].translateT[aniframeT[index]], 0);
if (anim2) {
if (aniframeS[index] == ani.SRTData[index].translateS.Length - 1) {
aniframeS[index] = 0;
} else {
aniframeS[index]++;
}
if (aniframeT[index] == ani.SRTData[index].translateT.Length - 1) {
aniframeT[index] = 0;
} else {
aniframeT[index]++;
}
if (aniframeR[index] == (ani.SRTData[index].rotate.Length - 2) / 2) {
aniframeR[index] = 0;
} else {
aniframeR[index]++;
}
if (aniframeScaleS[index] == ani.SRTData[index].scaleS.Length - 1) {
aniframeScaleS[index] = 0;
} else {
aniframeScaleS[index]++;
}
if (aniframeScaleT[index] == ani.SRTData[index].scaleT.Length - 1) {
aniframeScaleT[index] = 0;
} else {
aniframeScaleT[index]++;
}
}
if (!mat.isEnvironmentMap) {
Gl.glScalef(1.0f / mat.width, 1.0f / mat.height, 1.0f);
}
} else {
if (!mat.isEnvironmentMap) {
if (mat.mtx is null) {
Gl.glScalef(mat.scaleS / mat.width, mat.scaleT / mat.height, 1.0f);
Gl.glRotatef(mat.rot, 0, 1, 0);
Gl.glTranslatef(mat.transS, mat.transT, 0);
} else {
Gl.glScalef(1.0f / mat.width, 1.0f / mat.height, 1.0f);
Gl.glMultMatrixf(mat.mtx);
}
}
}
} catch {
}
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glAlphaFunc(Gl.GL_GREATER, 0f);
Gl.glColor4f(0xff, 0xff, 0xff, 0xff);
if (licht && (((mat.PolyAttrib >> 0) & 0x1) == 0 && ((mat.PolyAttrib >> 1) & 0x1) == 0 && ((mat.PolyAttrib >> 2) & 0x1) == 0 && ((mat.PolyAttrib >> 3) & 0x1) == 0) == false) {
//Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, new float[] { (float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, new float[] { (float)mat.AmbientColor.R / 255f, (float)mat.AmbientColor.G / 255f, (float)mat.AmbientColor.B / 255f, (float)mat.AmbientColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, new float[] { (float)mat.SpecularColor.R / 255f, (float)mat.SpecularColor.G / 255f, (float)mat.SpecularColor.B / 255f, (float)mat.SpecularColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_EMISSION, new float[] { (float)mat.EmissionColor.R / 255f, (float)mat.EmissionColor.G / 255f, (float)mat.EmissionColor.B / 255f, (float)mat.EmissionColor.A / 255f });
//Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, new float[] { 1, 1, 1, 0 });
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, new float[] { (float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, new float[] { (float)mat.AmbientColor.R / 255f, (float)mat.AmbientColor.G / 255f, (float)mat.AmbientColor.B / 255f, (float)mat.AmbientColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_SPECULAR, new float[] { (float)mat.SpecularColor.R / 255f, (float)mat.SpecularColor.G / 255f, (float)mat.SpecularColor.B / 255f, (float)mat.SpecularColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_EMISSION, new float[] { (float)mat.EmissionColor.R / 255f, (float)mat.EmissionColor.G / 255f, (float)mat.EmissionColor.B / 255f, (float)mat.EmissionColor.A / 255f });
//Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_POSITION, new float[] { 1.0f, 1.0f, 1.0f, 0 });
Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_DIFFUSE, new float[] { (float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_AMBIENT, new float[] { (float)mat.AmbientColor.R / 255f, (float)mat.AmbientColor.G / 255f, (float)mat.AmbientColor.B / 255f, (float)mat.AmbientColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_SPECULAR, new float[] { (float)mat.SpecularColor.R / 255f, (float)mat.SpecularColor.G / 255f, (float)mat.SpecularColor.B / 255f, (float)mat.SpecularColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_EMISSION, new float[] { (float)mat.EmissionColor.R / 255f, (float)mat.EmissionColor.G / 255f, (float)mat.EmissionColor.B / 255f, (float)mat.EmissionColor.A / 255f });
//Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_POSITION, new float[] { 1.0f, 1.0f, 1.0f, 0 });
Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_DIFFUSE, new float[] { (float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_AMBIENT, new float[] { (float)mat.AmbientColor.R / 255f, (float)mat.AmbientColor.G / 255f, (float)mat.AmbientColor.B / 255f, (float)mat.AmbientColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_SPECULAR, new float[] { (float)mat.SpecularColor.R / 255f, (float)mat.SpecularColor.G / 255f, (float)mat.SpecularColor.B / 255f, (float)mat.SpecularColor.A / 255f });
Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_EMISSION, new float[] { (float)mat.EmissionColor.R / 255f, (float)mat.EmissionColor.G / 255f, (float)mat.EmissionColor.B / 255f, (float)mat.EmissionColor.A / 255f });
Gl.glEnable(Gl.GL_LIGHTING);
if (((mat.PolyAttrib >> 0) & 0x1) == 1) {
Gl.glEnable(Gl.GL_LIGHT0);
} else {
Gl.glDisable(Gl.GL_LIGHT0);
}
if (((mat.PolyAttrib >> 1) & 0x1) == 1) {
Gl.glEnable(Gl.GL_LIGHT1);
} else {
Gl.glDisable(Gl.GL_LIGHT1);
}
if (((mat.PolyAttrib >> 2) & 0x1) == 1) {
Gl.glEnable(Gl.GL_LIGHT2);
} else {
Gl.glDisable(Gl.GL_LIGHT2);
}
if (((mat.PolyAttrib >> 3) & 0x1) == 1) {
Gl.glEnable(Gl.GL_LIGHT3);
} else {
Gl.glDisable(Gl.GL_LIGHT3);
}
if (mat.diffuseColor) {
Gl.glColor4f((float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f);
}
} else {
Gl.glDisable(Gl.GL_LIGHTING);
Gl.glDisable(Gl.GL_LIGHT0);
Gl.glDisable(Gl.GL_LIGHT1);
Gl.glDisable(Gl.GL_LIGHT2);
Gl.glDisable(Gl.GL_LIGHT3);
if (mat.diffuseColor) {
Gl.glColor4f((float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f);
}
}
Gl.glEnable(Gl.GL_BLEND);
if (mat.isEnvironmentMap) {
Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
Gl.glEnable(Gl.GL_TEXTURE_GEN_S);
Gl.glEnable(Gl.GL_TEXTURE_GEN_T);
} else {
Gl.glDisable(Gl.GL_TEXTURE_GEN_S);
Gl.glDisable(Gl.GL_TEXTURE_GEN_T);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
}
int mode = -1;
switch ((mat.PolyAttrib >> 4) & 0x3) {
case 0:
mode = Gl.GL_MODULATE;
break;
case 1:
mode = Gl.GL_DECAL;
break;
case 2:
mode = Gl.GL_MODULATE;
break;
case 3:
mode = Gl.GL_MODULATE;
break;
}
Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, mode);
int cullmode = -1;
switch (mat.PolyAttrib >> 6 & 0x03) {
case 0x03:
cullmode = Gl.GL_NONE;
break;
case 0x02:
cullmode = Gl.GL_BACK;
break;
case 0x01:
cullmode = Gl.GL_FRONT;
break;
case 0x00:
cullmode = Gl.GL_FRONT_AND_BACK;
break;
}
Gl.glCullFace(cullmode);
}
} else {
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
}
if (!gOptColoring) {
Gl.glColor3f(1, 1, 1);
}
stackID = poly.StackID; // the first matrix used by this polygon
try {
Process3DCommand(poly.PolyData, Model.Materials[poly.MatId], poly.JointID, true);
} catch {
Console.WriteLine($"Invalid MatID {poly.MatId}! Could not read model [file: {file}]");
return;
}
}
writevertex = false;
}
///
/// Render model to OpenGL surface.
///
public void RenderModel(float elev, float ang) {
MTX44 tmp = new MTX44();
for (var j = 0; j < Model.Polygons.Count - 1; j++) {
var poly = Model.Polygons[j];
int matid = poly.MatId;
var mat = Model.Materials[matid];
}
Gl.glLineWidth(2.0F);
float xmin = Model.boundXmin;
float ymin = Model.boundYmin;
float zmin = Model.boundZmin;
float xmax = Model.boundXmax + Model.boundXmin;
float ymax = Model.boundYmax + Model.boundYmin;
float zmax = -Model.boundZmax + Model.boundZmin;
Gl.glLineWidth(1.0F);
////////////////////////////////////////////////////////////
// prepare the matrix stack
for (var i = 0; i < Model.Objects.Count; i++) {
var obj = Model.Objects[i];
var m_trans = obj.TransVect;
float[] f = loadIdentity();
if (obj.RestoreID != -1) {
Gl.glLoadMatrixf(MatrixStack[obj.RestoreID].Floats);
}
if (obj.StackID != -1) {
Gl.glMultMatrixf(obj.materix);
if (obj.isBillboard) {
if (!obj.isYBillboard) {
Gl.glRotatef(elev, 1, 0, 0);
}
Gl.glRotatef(-ang, 0, 1, 0);
}
Gl.glGetFloatv(Gl.GL_MODELVIEW_MATRIX, MatrixStack[obj.StackID].Floats);
stackID = obj.StackID; // save the last stackID
} else {
}
if (obj.visible) {
//light = Gl.glIsEnabled(Gl.GL_LIGHTING);
//Gl.glDisable(Gl.GL_LIGHTING);
//drawJoint(0.1f);
//if (light == 1)
//{
// Gl.glEnable(Gl.GL_LIGHTING);
//}
}
}
Gl.glLoadIdentity();
Gl.glLoadIdentity();
// display all polygons of the current model
for (var i = 0; i < Model.Polygons.Count - 1; i++) {
var poly = Model.Polygons[i];
if (gOptTexture && !gOptWireFrame && g_mat) {
int matid = poly.MatId;
if (matid == -1) {
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
if (writevertex) {
mattt.Add(new ImageBrush());
}
} else {
if (writevertex) {
mattt.Add(matt[matid]);
}
var mat = Model.Materials[matid];
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
// Convert pixel coords to normalised STs
Gl.glMatrixMode(Gl.GL_TEXTURE);
Gl.glLoadIdentity();
//scale
if (!mat.isEnvironmentMap) {
Gl.glScalef((float)mat.scaleS / ((float)mat.width), (float)mat.scaleT / ((float)mat.height), 1.0f);
}
//end
//Gl.glColor4f(1, 1, 0, 0);
Gl.glEnable(Gl.GL_ALPHA_TEST);
Gl.glAlphaFunc(Gl.GL_GREATER, 0f);
if (((mat.PolyAttrib >> 0xf) & 0x1) == 1 && (((mat.PolyAttrib >> 0) & 0x1) == 0 && ((mat.PolyAttrib >> 1) & 0x1) == 0 && ((mat.PolyAttrib >> 2) & 0x1) == 0 && ((mat.PolyAttrib >> 2) & 0x1) == 0) == false) {
Gl.glEnable(Gl.GL_LIGHTING);
if (((mat.PolyAttrib >> 0) & 0x1) == 1){ Gl.glEnable(Gl.GL_LIGHT0); }
else Gl.glDisable(Gl.GL_LIGHT0);
if (((mat.PolyAttrib >> 1) & 0x1) == 1){ Gl.glEnable(Gl.GL_LIGHT1); }
else Gl.glDisable(Gl.GL_LIGHT1);
if (((mat.PolyAttrib >> 2) & 0x1) == 1){ Gl.glEnable(Gl.GL_LIGHT2); }
else Gl.glDisable(Gl.GL_LIGHT2);
if (((mat.PolyAttrib >> 3) & 0x1) == 1){ Gl.glEnable(Gl.GL_LIGHT3); }
else Gl.glDisable(Gl.GL_LIGHT3);
Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE);
Gl.glColor4f((float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f);
Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT);
Gl.glColor4f((float)mat.AmbientColor.R / 255f, (float)mat.AmbientColor.G / 255f, (float)mat.AmbientColor.B / 255f, (float)mat.AmbientColor.A / 255f);
Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR);
Gl.glColor4f((float)mat.SpecularColor.R / 255f, (float)mat.SpecularColor.G / 255f, (float)mat.SpecularColor.B / 255f, (float)mat.SpecularColor.A / 255f);
Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_EMISSION);
Gl.glColor4f((float)mat.EmissionColor.R / 255f, (float)mat.EmissionColor.G / 255f, (float)mat.EmissionColor.B / 255f, (float)mat.EmissionColor.A / 255f);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
} else {
Gl.glDisable(Gl.GL_LIGHTING);
Gl.glColorMaterial(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE);
Gl.glColor4f((float)mat.DiffuseColor.R / 255f, (float)mat.DiffuseColor.G / 255f, (float)mat.DiffuseColor.B / 255f, (float)mat.DiffuseColor.A / 255f);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
}
Gl.glEnable(Gl.GL_BLEND);
if (mat.isEnvironmentMap) {
Gl.glTexGeni(Gl.GL_S, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
Gl.glTexGeni(Gl.GL_T, Gl.GL_TEXTURE_GEN_MODE, Gl.GL_SPHERE_MAP);
Gl.glEnable(Gl.GL_TEXTURE_GEN_S);
Gl.glEnable(Gl.GL_TEXTURE_GEN_T);
//Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE);
} else {
Gl.glDisable(Gl.GL_TEXTURE_GEN_S);
Gl.glDisable(Gl.GL_TEXTURE_GEN_T);
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
}
int mode = -1;
switch ((mat.PolyAttrib >> 4) & 0x3) {
case 0:
mode = Gl.GL_MODULATE;
break;
case 1:
mode = Gl.GL_DECAL;
break;
case 2:
mode = Gl.GL_MODULATE;
break;
case 3:
mode = Gl.GL_MODULATE;
break;
}
Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, mode);
int cullmode = -1;
//Gl.glEnable(Gl.GL_CULL_FACE);
switch (mat.PolyAttrib >> 6 & 0x03) {
case 0x03: cullmode = Gl.GL_NONE; break;
case 0x02: cullmode = Gl.GL_BACK; break;
case 0x01: cullmode = Gl.GL_FRONT; break;
case 0x00: cullmode = Gl.GL_FRONT_AND_BACK; break;
}
Gl.glCullFace(cullmode);
}
} else {
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
}
if (!gOptColoring) {
//Gl.glColor3f(1, 1, 1);
}
stackID = poly.StackID; // the first matrix used by this polygon
Process3DCommand(poly.PolyData, Model.Materials[poly.MatId], poly.JointID, false);
}
writevertex = false;
}
public bool DoJointAnimation(MKDS_Course_Editor.NSBCA.NSBCA.NSBCA_File ca, int selectedanim, bool anim, int i) {
try {
if (ca.Header.file_size != 0 && selectedanim != -1) {
float[] s = loadIdentity();
float[] r = loadIdentity();
float[] t = loadIdentity();
//float[] mt = loadIdentity();
//scale
float scalex = float.NaN;
float scaley = float.NaN;
float scalez = float.NaN;
if (ca.JAC[selectedanim].ObjInfo[i].scale[0][0].Count != 0) {
scalex = ca.JAC[selectedanim].ObjInfo[i].scale[0][0][0];// + ca.JAC[selectedanim].ObjInfo[i].scale[0][1][0]) / 2;// - ca.JAC[selectedanim].ObjInfo[i].scale[0][1][S2x[i]];//ca.JAC[selectedanim].ObjInfo[i].scale[0][0][S2x[i]];
} else if (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][0].Count != 0) {
scalex = ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][0][Sx[i]];// -ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][1][Sx[i]];
}
if (ca.JAC[selectedanim].ObjInfo[i].scale[1][0].Count != 0) {
scaley = ca.JAC[selectedanim].ObjInfo[i].scale[1][0][0];// + ca.JAC[selectedanim].ObjInfo[i].scale[1][1][0]) / 2;// -ca.JAC[selectedanim].ObjInfo[i].scale[1][1][S2y[i]];//ca.JAC[selectedanim].ObjInfo[i].scale[1][0][S2y[i]];
} else if (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][0].Count != 0) {
scaley = ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][0][Sy[i]];// -ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][1][Sy[i]];
}
if (ca.JAC[selectedanim].ObjInfo[i].scale[2][0].Count != 0) {
scalez = ca.JAC[selectedanim].ObjInfo[i].scale[2][0][0];// + ca.JAC[selectedanim].ObjInfo[i].scale[2][1][0]) / 2;// -ca.JAC[selectedanim].ObjInfo[i].scale[2][1][S2z[i]];//ca.JAC[selectedanim].ObjInfo[i].scale[2][0][S2z[i]];
} else if (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][0].Count != 0) {
scalez = ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][0][Sz[i]];// -ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][1][Sz[i]];
}
if (!float.IsNaN(scalex) && !float.IsNaN(scaley) && !float.IsNaN(scalez)) {
s = scale(s, scalex, scaley, scalez);
} else {
//s = scale(s, Model.Objects[i].scale[0], Model.Objects[i].scale[1], Model.Objects[i].scale[2]);
}
/*if(ca.JAC[selectedanim].ObjInfo[i].scale[0][0].Count != 0)
{
//mt = scale(mt, ca.JAC[0].ObjInfo[i].scale[0][0][S2[i]], ca.JAC[0].ObjInfo[i].scale[0][1][S2[i]], ca.JAC[0].ObjInfo[i].scale[0][2][S2[i]]);
s = scale(s, ca.JAC[selectedanim].ObjInfo[i].scale[0][0][S2[i]], ca.JAC[selectedanim].ObjInfo[i].scale[1][0][S2[i]], ca.JAC[selectedanim].ObjInfo[i].scale[2][0][S2[i]]);
//Gl.glScalef(ca.JAC[selectedanim].ObjInfo[i].scale[0][0][S2[i]], ca.JAC[selectedanim].ObjInfo[i].scale[1][0][S2[i]], ca.JAC[selectedanim].ObjInfo[i].scale[2][0][S2[i]]);
}*/
try {
if (ca.JAC[selectedanim].ObjInfo[i].rotate.Count != 0) {
if ((((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) >> 15 & 0x1) == 1) {
int pvneg = ca.JAC[selectedanim].JointData[(((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) & 0x7fff) * 6];//Utils.Read2BytesAsInt16(ca.JAC[selectedanim].JointData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 6 + 0);
int a = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].JointData, (((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) & 0x7fff) * 6 + 2);
int b = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].JointData, (((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) & 0x7fff) * 6 + 4);
a = Sign(a, 16);
b = Sign(b, 16);
//mt = multMatrix(mt, Nsbmd.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f)));
//Gl.glMultMatrixf(Nsbmd.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f)));
r = NSBMD.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f));//multMatrix(r, Nsbmd.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f)));
} else {
int x = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].RotationData, (((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) & 0x7fff) * 10 + 2);
x = Sign(x, 16);
int y = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].RotationData, (((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) & 0x7fff) * 10 + 4);
y = Sign(y, 16);
int z = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].RotationData, (((int)ca.JAC[selectedanim].ObjInfo[i].rotate[0]) & 0x7fff) * 10 + 6);
z = Sign(z, 16);
OpenTK.Matrix4 X = OpenTK.Matrix4.CreateRotationX((float)x / 131072F);//((float)x * (float)Math.PI) / 32768F);
OpenTK.Matrix4 Y = OpenTK.Matrix4.CreateRotationY((float)y / 131072F);//((float)y * (float)Math.PI) / 32768F);
OpenTK.Matrix4 Z = OpenTK.Matrix4.CreateRotationZ((float)z / 131072F);//((float)z * (float)Math.PI) / 32768F);
OpenTK.Matrix4 full = OpenTK.Matrix4.Identity;
full = OpenTK.Matrix4.Mult(full, X);
full = OpenTK.Matrix4.Mult(full, Y);
full = OpenTK.Matrix4.Mult(full, Z);
}
} else if (ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0].Count != 0) {
//Gl.glMultMatrixf(Nsbmd.mtxPivot(new float[]{ca.JAC[0].ObjInfo[i].rotate_keyframes[1][R[i]],ca.JAC[0].ObjInfo[i].rotate_keyframes[0][R[i]]}, obj.Pivot, obj.Neg));
//Gl.glRotatef(ca.JAC[0].ObjInfo[i].rotate_keyframes[0][R[i]], 0,(ca.JAC[0].ObjInfo[i].rotate_keyframes[1][R[i]] == 1 ? 1 : 0),(ca.JAC[0].ObjInfo[i].rotate_keyframes[1][R[i]] == 0 ? 1 : 0));
if (ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[1][R[i]] == 1) {
int pvneg = ca.JAC[selectedanim].JointData[(int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 6];//Utils.Read2BytesAsInt16(ca.JAC[selectedanim].JointData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 6 + 0);
int a = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].JointData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 6 + 2);
int b = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].JointData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 6 + 4);
a = Sign(a, 16);
b = Sign(b, 16);
//mt = multMatrix(mt, Nsbmd.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f)));
//Gl.glMultMatrixf(Nsbmd.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f)));
r = NSBMD.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f));//multMatrix(r, Nsbmd.mtxPivot(new float[] { (float)a / 4096f, (float)b / 4096f }, (pvneg >> 0 & 0x0f), (pvneg >> 4 & 0x0f)));
} else {
float param = ca.JAC[selectedanim].RotationData[(int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 10];
//float u = (float)Math.Pow(2.0f, param) * (float)180 / 131072F;
int x = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].RotationData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 10 + 2);
x = Sign(x, 16);
int y = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].RotationData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 10 + 4);
y = Sign(y, 16);
int z = Utils.Read2BytesAsInt16(ca.JAC[selectedanim].RotationData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 10 + 6);
z = Sign(z, 16);
OpenTK.Matrix4 X = OpenTK.Matrix4.CreateRotationX((float)x / 131072F);//((float)x * (float)Math.PI) / 32768F);
OpenTK.Matrix4 Y = OpenTK.Matrix4.CreateRotationY((float)y / 131072F);//((float)y * (float)Math.PI) / 32768F);
OpenTK.Matrix4 Z = OpenTK.Matrix4.CreateRotationZ((float)z / 131072F);//((float)z * (float)Math.PI) / 32768F);
OpenTK.Matrix4 full = OpenTK.Matrix4.Identity;
full = OpenTK.Matrix4.Mult(full, X);
full = OpenTK.Matrix4.Mult(full, Y);
full = OpenTK.Matrix4.Mult(full, Z);
/*int x = (param) & 0xFF;
if ((x & 0x200) != 0){ x |= -256; }
int y = (param >> 8) & 0xFF;
if ((y & 0x200) != 0){ y |= -256; }
int z = (param >> 16) & 0xFF;
if ((z & 0x200) != 0){ z |= -256; }*/
//Gl.glRotatef((float)x / 32768F * 180F, 1, 0, 0);
//Gl.glRotatef((float)y / 32768F * 180F, 0, 1, 0);
//Gl.glRotatef((float)z / 32768F * 180F, 0, 0, 1);
//param /= 4096f;
//float un = 2048f;//(float)Utils.Read4BytesAsInt32(ca.JAC[selectedanim].RotationData, (int)ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0][R[i]] * 10 + 6) / 4096f;
//Gl.glRotatef(x / un, 1, 0, 0);//((float)x * (float)Math.PI) / 180f, 1, 0, 0);
//Gl.glRotatef(y / un, 0, 1, 0);//((float)y * (float)Math.PI) / 180f, 0, 1, 0);
//Gl.glRotatef(z / un, 0, 0, 1);//((float)z * (float)Math.PI) / 180f, 0, 0, 1);
//mt = rotate(mt, x, y, z);
//Gl.glMultMatrixf(full.ToFloat());
}
} else {
//r = multMatrix(r, Model.Objects[i].rotate_mtx);
}
} catch { }
float transx = float.NaN;
float transy = float.NaN;
float transz = float.NaN;
if (ca.JAC[selectedanim].ObjInfo[i].translate[0].Count != 0) {
transx = ca.JAC[selectedanim].ObjInfo[i].translate[0][0];// Model.modelScale;
} else if (ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[0].Count != 0) {
transx = ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[0][Tx[i]];// Model.modelScale;
}
if (ca.JAC[selectedanim].ObjInfo[i].translate[1].Count != 0) {
transy = ca.JAC[selectedanim].ObjInfo[i].translate[1][0];// Model.modelScale;
} else if (ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1].Count != 0) {
transy = ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1][Ty[i]];// Model.modelScale;
}
if (ca.JAC[selectedanim].ObjInfo[i].translate[2].Count != 0) {
transz = ca.JAC[selectedanim].ObjInfo[i].translate[2][0];// Model.modelScale;
} else if (ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2].Count != 0) {
transz = ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2][Tz[i]];// Model.modelScale;
}
if (!float.IsNaN(transx) && !float.IsNaN(transy) && !float.IsNaN(transz)) {
t = Translate(t, transx / Model.modelScale/* - (Model.Objects[i].X)*/, transy / Model.modelScale/* - (Model.Objects[i].Y)*/, transz / Model.modelScale/* - (Model.Objects[i].Z)*/);
} else {
//t = translate(t, Model.Objects[i].X, Model.Objects[i].Y, Model.Objects[i].Z);
}
//if(ca.JAC[selectedanim].ObjInfo[i].translate[0].Count != 0)
//{
//mt = translate(mt, ca.JAC[0].ObjInfo[i].translate[0][T2[i]], ca.JAC[0].ObjInfo[i].translate_keyframes[1][T2[i]], ca.JAC[0].ObjInfo[i].translate_keyframes[2][T2[i]]);
//Gl.glTranslatef(ca.JAC[selectedanim].ObjInfo[i].translate[0][T2[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1][T2[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2][T2[i]] / Model.modelScale);
// t = translate(t,ca.JAC[selectedanim].ObjInfo[i].translate[0][T2[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1][T2[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2][T2[i]] / Model.modelScale);
//}
float[] m = loadIdentity();
//Gl.glGetFloatv(Gl.GL_MODELVIEW_MATRIX, m);
m = multMatrix(m, t);
//m = translate(m, Model.Objects[i].X, Model.Objects[i].Y, Model.Objects[i].Z);
//if (Model.Objects[i].IsRotated)
//{
//float[] rt = loadIdentity();
//rt = multMatrix(rt, r);
//rt = multMatrix(rt, Model.Objects[i].rotate_mtx);
m = multMatrix(m, r);
// m = multMatrix(m, Model.Objects[i].rotate_mtx);
//}
//else
//{
// m = multMatrix(m, r);
//}
m = multMatrix(m, s);
//m = scale(m, Model.Objects[i].scale[0], Model.Objects[i].scale[1], Model.Objects[i].scale[2]);
Gl.glMultMatrixf(m);
//s = loadIdentity();
//r = loadIdentity();
//t = loadIdentity();
//Gl.glMultMatrixf(mt);
//mt = loadIdentity();
//if(ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][0].Count != 0)
// {
//mt = scale(mt, ca.JAC[0].ObjInfo[i].scale_keyframes[0][0][S[i]], ca.JAC[0].ObjInfo[i].scale_keyframes[0][1][S[i]], ca.JAC[0].ObjInfo[i].scale_keyframes[0][2][S[i]]);
//Gl.glScalef((ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][0][S[i]] - ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][1][S[i]]), (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][0][S[i]] - ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][1][S[i]]), (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][0][S[i]] - ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][1][S[i]]));
//s = scale(s, (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][0][S[i]] - ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][1][S[i]]), (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][0][S[i]] - ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][1][S[i]]), (ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][0][S[i]] - ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][1][S[i]]));
//}
//if(ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[0].Count != 0)
//{
//mt = translate(mt, ca.JAC[0].ObjInfo[i].translate_keyframes[0][T[i]], ca.JAC[0].ObjInfo[i].translate_keyframes[1][T[i]], ca.JAC[0].ObjInfo[i].translate_keyframes[2][T[i]]);
//Gl.glTranslatef(ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[0][T[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1][T[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2][T[i]] / Model.modelScale);
// t = translate(t, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[0][T[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1][T[i]] / Model.modelScale, ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2][T[i]] / Model.modelScale);
//}
// m = loadIdentity();
//m = multMatrix(m, t);
//m = multMatrix(m, r);
//m = multMatrix(m, s);
//Gl.glMultMatrixf(m);
if (anim) {
if (Tx[i] == ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[0].Count - 1) {
Tx[i] = 0;
} else {
Tx[i]++;
}
if (Ty[i] == ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[1].Count - 1) {
Ty[i] = 0;
} else {
Ty[i]++;
}
if (Tz[i] == ca.JAC[selectedanim].ObjInfo[i].translate_keyframes[2].Count - 1) {
Tz[i] = 0;
} else {
Tz[i]++;
}
if (R[i] == ca.JAC[selectedanim].ObjInfo[i].rotate_keyframes[0].Count - 1) {
R[i] = 0;
} else {
R[i]++;
}
if (Sx[i] == ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[0][0].Count - 1) {
Sx[i] = 0;
} else {
Sx[i]++;
}
if (Sy[i] == ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[1][0].Count - 1) {
Sy[i] = 0;
} else {
Sy[i]++;
}
if (Sz[i] == ca.JAC[selectedanim].ObjInfo[i].scale_keyframes[2][0].Count - 1) {
Sz[i] = 0;
} else {
Sz[i]++;
}
}
return true;
} else {
return false;
}
} catch { return true; }
}
public static float[] Translate(float[] a, float x, float y, float z) {
float[] b = loadIdentity();
b[12] = x;
b[13] = y;
b[14] = z;
return multMatrix(a, b);
}
public static float[] loadIdentity() {
float[] a = new float[16];
a[0] = 1.0F;
a[5] = 1.0F;
a[10] = 1.0F;
a[15] = 1.0F;
return a;
}
public static float[] scale(float[] a, float x, float y, float z) {
float[] b = loadIdentity();
b[0] = x;
b[5] = y;
b[10] = z;
return multMatrix(a, b);
}
private void setColor(int drawMode, float[] color) {
/*bool checkJoint = true;
bool selJoint = true;
if(jointId < Frame.jointList.length)
{
checkJoint = Frame.jointList[jointId].isChecked();
selJoint = Frame.jointList[jointId].isSelected();
}
boolean checkStack = visible[stackId];
boolean checkPoly = Frame.polygonList[polyId].isChecked();
boolean checkMat = true;
boolean selMat = true;
if(matId < Frame.materialList.length)
{
checkMat = Frame.materialList[matId].isChecked();
selMat = Frame.materialList[matId].isSelected();
}
boolean selPoly = Frame.polygonList[polyId].isSelected();*/
switch (drawMode) {
case 0: // '\0'
default:
break;
case 1: // '\001'
color = lineColorOff;
/*if(selPoly)
{
color = lineColorOn;
if(Frame.points)
color = lineColorEdit;
}*/
break;
case 2: // '\002'
color = pointColorOff;
/*if(selPoly)
color = pointColorOn;*/
break;
case 3: // '\003'
color = jointColor;
/*if(selJoint)
color = jointColorOn;*/
break;
case 4: // '\004'
color = linkColor;
/*if(selJoint)
color = linkColorOn;*/
break;
}
float alpha = color[3];
//if(drawMode == 0 && !checkPoly || (drawMode == 3 || drawMode == 4) && !checkJoint)
// alpha = 0.2F;
//if(drawMode == 0 && !checkStack)
// alpha = 0.0F;
Gl.glColor4f(color[0], color[1], color[2], alpha);
}
private float[] baseColor = {
1.0F, 1.0F, 1.0F, 1.0F
};
private float[] shadeColor = {
0.3F, 0.3F, 0.3F, 1.0F
};
private float[] selColor = {
1.0F, 0.0F, 0.0F, 1.0F
};
private float[] lineColorOff = {
0.0F, 0.02745098F, 0.5686275F, 1.0F
};
private float[] lineColorOn = {
0.2627451F, 1.0F, 0.6392157F, 1.0F
};
private float[] lineColorEdit = {
0.3921569F, 0.8627451F, 1.0F, 1.0F
};
private float[] pointColorOff = {
0.3921569F, 0.1960784F, 0.4313726F, 1.0F
};
private float[] pointColorOn = {
0.7843137F, 0.0F, 0.7843137F, 1.0F
};
private float[] pointColorEdit = {
0.7843137F, 0.0F, 0.7843137F, 1.0F
};
private float[] jointColor = {
0.0F, 0.4F, 0.0F, 1.0F
};
private float[] jointColorOn = {
0.4F, 0.0F, 0.0F, 1.0F
};
private float[] linkColor = {
0.0F, 0.0F, 0.8F, 0.8F
};
private float[] linkColorOn = {
0.8F, 0.0F, 0.0F, 0.8F
};
public static float[] multMatrix(float[] a, float[] b) {
float[] c = new float[16];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
c[(i << 2) + j] = 0.0F;
for (int k = 0; k < 4; k++)
c[(i << 2) + j] += a[(k << 2) + j] * b[(i << 2) + k];
}
}
return c;
}
public static float[] loadMatrix(float[] fmatrix, int stack) {
float[] a = new float[16];
a[0] = 1.0F;
a[5] = 1.0F;
a[10] = 1.0F;
a[15] = 1.0F;
for (int i = 0; i < a.Length; i++)
a[i] = fmatrix[stack * 16 + i];
return a;
}
public float[] pullVector(float[] fmatrix, int offset) {
float[] cmatrix = new float[16];
for (int i = 0; i < cmatrix.Length; i++)
cmatrix[i] = fmatrix[offset + i];
return multVector(cmatrix, new float[] {
0.0F, 0.0F, 0.0F
});
}
public float[] multVector(float[] cmatrix, float[] vtxState) {
float[] vtxTrans = new float[3];
for (int i = 0; i < 3; i++) {
float c0 = vtxState[0] * cmatrix[0 + i];
float c1 = vtxState[1] * cmatrix[4 + i];
float c2 = vtxState[2] * cmatrix[8 + i];
float c3 = cmatrix[12 + i];
vtxTrans[i] = c0 + c1 + c2 + c3;
}
return vtxTrans;
}
// Private Methods (7)
///
/// Convert texel.
///
private bool convert_4x4texel(uint[] tex, int width, int height, ushort[] data, RGBA[] pal, RGBA[] rgbaOut) {
int w = width / 4;
int h = height / 4;
// traverse 'w x h blocks' of 4x4-texel
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++) {
int index = y * w + x;
UInt32 t = tex[index];
ushort d = data[index];
ushort addr = (ushort)(d & 0x3fff);
ushort mode = (ushort)((d >> 14) & 3);
// traverse every texel in the 4x4 texels
for (int r = 0; r < 4; r++)
for (int c = 0; c < 4; c++) {
int texel = (int)((t >> ((r * 4 + c) * 2)) & 3);
RGBA pixel = rgbaOut[(y * 4 + r) * width + (x * 4 + c)];
switch (mode) {
case 0:
pixel = pal[(addr << 1) + texel];
if (texel == 3){ pixel = RGBA.Transparent; } // make it transparent, alpha = 0
break;
case 2:
pixel = pal[(addr << 1) + texel];
break;
case 1:
switch (texel) {
case 0:
case 1:
pixel = pal[(addr << 1) + texel];
break;
case 2:
pixel.R = (byte)((pal[(addr << 1)].R + pal[(addr << 1) + 1].R) / 2L);
pixel.G = (byte)((pal[(addr << 1)].G + pal[(addr << 1) + 1].G) / 2L);
pixel.B = (byte)((pal[(addr << 1)].B + pal[(addr << 1) + 1].B) / 2L);
pixel.A = 0xff;
break;
case 3:
pixel = RGBA.Transparent; // make it transparent, alpha = 0
break;
}
break;
case 3:
switch (texel) {
case 0:
case 1:
pixel = pal[(addr << 1) + texel];
break;
case 2:
pixel.R = (byte)((pal[(addr << 1)].R * 5L + pal[(addr << 1) + 1].R * 3L) / 8);
pixel.G = (byte)((pal[(addr << 1)].G * 5L + pal[(addr << 1) + 1].G * 3L) / 8);
pixel.B = (byte)((pal[(addr << 1)].B * 5L + pal[(addr << 1) + 1].B * 3L) / 8);
pixel.A = 0xff;
break;
case 3:
pixel.R = (byte)((pal[(addr << 1)].R * 3L + pal[(addr << 1) + 1].R * 5L) / 8);
pixel.G = (byte)((pal[(addr << 1)].G * 3L + pal[(addr << 1) + 1].G * 5L) / 8);
pixel.B = (byte)((pal[(addr << 1)].B * 3L + pal[(addr << 1) + 1].B * 5L) / 8);
pixel.A = 0xff;
break;
}
break;
}
rgbaOut[(y * 4 + r) * width + (x * 4 + c)] = pixel;
}
}
return true;
}
///
/// Convert texel (wrapper for type safety issues).
///
private void convert_4x4texel_b(byte[] tex, int width, int height, byte[] data, RGBA[] pal, RGBA[] rgbaOut) {
var list1 = new List();
for (int i = 0; i < (tex.Length + 1) / 4; ++i)
list1.Add(Utils.Read4BytesAsUInt32(tex, i * 4));
var list2 = new List();
for (int i = 0; i < (data.Length + 1) / 2; ++i)
list2.Add(Utils.Read2BytesAsushort(data, i * 2));
var b = convert_4x4texel(list1.ToArray(), width, height, list2.ToArray(), pal, rgbaOut);
}
///
/// Make texture for model.
///
/// NSBMD Model
private void MakeTexture(NSBMDModel mod) {
Gl.glMatrixMode(Gl.GL_TEXTURE_MATRIX);
Gl.glLoadIdentity();
//Console.WriteLine("DEBUG: making texture for model '{0}'...", mod.Name);
for (int i = 0; i < mod.Materials.Count - 1; i++) {
try {
if (mod.Materials[i].format == 0) // format 0 is no texture
{
matt.Add(new ImageBrush());
continue;
}
var mat = mod.Materials[i];
if (mat is null || (mat.paldata is null && mat.format != 7)) {
matt.Add(new ImageBrush());
continue;
}
int pixelnum = mat.width * mat.height;
var image = new RGBA[pixelnum];
switch (mat.format) {
// No Texture
case 0:
//puts( "ERROR: format 0" );
mattt.Add(new ImageBrush());
continue;
// A3I5 Translucent Texture (3bit Alpha, 5bit Color Index)
case 1:
for (int j = 0; j < pixelnum; j++) {
int index = mat.texdata[j] & 0x1f;
int alpha = (mat.texdata[j] >> 5);// & 7;
alpha = ((alpha * 4) + (alpha / 2)) * 8;// << 3;
image[j] = mat.paldata[index];
image[j].A = (byte)alpha;
}
break;
// 4-Color Palette Texture
case 2:
if (mat.color0 != 0){ mat.paldata[0] = RGBA.Transparent; } // made palette entry 0 transparent
for (int j = 0; j < pixelnum; j++) {
uint index = mat.texdata[j / 4];
index = (index >> ((j % 4) << 1)) & 3;
image[j] = mat.paldata[index];
}
break;
// 16-Color Palette Texture
case 3:
if (mat.color0 != 0){ mat.paldata[0] = RGBA.Transparent; } // made palette entry 0 transparent
for (int j = 0; j < pixelnum; j++) {
var matindex = j / 2;
if (mat.texdata.Length < matindex)
continue;
int index = mat.texdata[matindex];
index = (index >> ((j % 2) << 2)) & 0x0f;
if (mat.paldata is null)
continue;
if (index < 0 || index >= mat.paldata.Length)
continue;
if (j < 0 || j >= pixelnum)
continue;
image[j] = mat.paldata[index];
}
break;
// 256-Color Palette Texture
case 4:
if (mat.color0 != 0){ mat.paldata[0] = RGBA.Transparent; } // made palette entry 0 transparent
// made palette entry 0 transparent
for (int j = 0; j < pixelnum; j++) {
image[j] = mat.paldata[mat.texdata[j]];
}
break;
// 4x4-Texel Compressed Texture
case 5:
convert_4x4texel_b(mat.texdata, mat.width, mat.height, mat.spdata, mat.paldata, image);
break;
// A5I3 Translucent Texture (5bit Alpha, 3bit Color Index)
case 6:
for (int j = 0; j < pixelnum; j++) {
int index = mat.texdata[j] & 0x7;
int alpha = (mat.texdata[j] >> 3);
alpha *= 8; //((alpha * 4) + (alpha / 2)) << 3;
image[j] = mat.paldata[index];
image[j].A = (byte)alpha;
}
break;
// Direct Color Texture
case 7:
for (int j = 0; j < pixelnum; j++) {
//ushort p = (ushort)(mat.texdata[j * 2] + (mat.texdata[j * 2 + 1] << 8));
//image[j].R = (byte)(((p >> 0) & 0x1f) << 3);
//image[j].G = (byte)(((p >> 5) & 0x1f) << 3);
//image[j].B = (byte)(((p >> 10) & 0x1f) << 3);
//image[j].A = (byte)(((p & 0x8000) != 0) ? 0xff : 0);
image[j] = RGBA.fromColor(Tinke.Convertir.BGR555ToColor(mat.texdata[j * 2], mat.texdata[j * 2 + 1]));
ushort p = (ushort)(mat.texdata[j * 2] + (mat.texdata[j * 2 + 1] << 8));
image[j].A = (byte)(((p & 0x8000) != 0) ? 0xff : 0);
}
break;
}
//Console.WriteLine("convert matid = {0}", i);
//Console.WriteLine("\ttex '{0}': {1} [{2},{3}] texsize = {4}", mat.texname, TEXTURE_FORMATS[mat.format], mat.width, mat.height, mat.texsize);
//Console.WriteLine("\tpal '{0}': pixelnum = {1}, repeat = {2}", mat.palname, pixelnum, mat.repeat);
var imageBytesList = new List();
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(mat.width, mat.height);
for (int k = 0; k < image.Length; ++k) {
bitmap.SetPixel(k - ((k / (mat.width)) * (mat.width)), k / (mat.width), image[k].ToColor());
imageBytesList.Add(image[k].R);
imageBytesList.Add(image[k].G);
imageBytesList.Add(image[k].B);
imageBytesList.Add((image[k].A));
}
var imageBytes = imageBytesList.ToArray();
if (mat.flipS == 1 && mat.flipT == 1) {
System.Drawing.Bitmap bitmap2 = new System.Drawing.Bitmap(mat.width * 2, mat.height * 2);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap2)) {
g.DrawImage(bitmap, 0, 0);
System.Drawing.Bitmap tmp = bitmap;
tmp.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipX);
g.DrawImage(tmp, mat.width, 0);
tmp = bitmap;
tmp.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipY);
g.DrawImage(tmp, mat.width, mat.height);
tmp = bitmap;
tmp.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipX);
g.DrawImage(tmp, 0, mat.height);
}
bitmap = bitmap2;
} else if (mat.flipS == 1) {
//br.TileMode = System.Windows.Media.TileMode.FlipX;
System.Drawing.Bitmap bitmap2 = new System.Drawing.Bitmap(mat.width * 2, mat.height);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap2)) {
g.DrawImage(bitmap, 0, 0);
System.Drawing.Bitmap tmp = bitmap;
tmp.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipX);
g.DrawImage(tmp, mat.width, 0);
}
bitmap = bitmap2;
} else if (mat.flipT == 1) {
//br.TileMode = System.Windows.Media.TileMode.FlipY;
System.Drawing.Bitmap bitmap2 = new System.Drawing.Bitmap(mat.width, mat.height * 2);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap2)) {
g.DrawImage(bitmap, 0, 0);
System.Drawing.Bitmap tmp = bitmap;
tmp.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipY);
g.DrawImage(tmp, 0, mat.height);
}
bitmap = bitmap2;
} else if (mat.repeatS == 1 || mat.repeatT == 1) {
//br.TileMode = System.Windows.Media.TileMode.Tile;
} else {
//br.TileMode = System.Windows.Media.TileMode.None;
}
ImageBrush br = new ImageBrush(CreateBitmapSourceFromBitmap(bitmap));
br.Viewbox = new Rect(0, 0, br.ImageSource.Width, br.ImageSource.Height);
br.ViewboxUnits = BrushMappingMode.Absolute;
br.Viewport = new Rect(0, 0, 1, 1);
br.ViewportUnits = BrushMappingMode.Absolute;
br.Stretch = Stretch.None;
//br.ImageSource = CreateBitmapSourceFromBitmap(bitmap);
br.Opacity = (double)(((mat.Alpha + 1) * 8) - 1) / 1.0d;
matt.Add(br);
//ttt
Gl.glBindTexture(Gl.GL_TEXTURE_2D, i + 1 + matstart);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, mat.width, mat.height, 0, Gl.GL_RGBA,
Gl.GL_UNSIGNED_BYTE,
imageBytes);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
if (mat.flipS == 1 && mat.repeatS == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT);
} else if (mat.repeatS == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
} else {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
}
if (mat.flipT == 1 && mat.repeatT == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT);
} else if (mat.repeatT == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
} else {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
}
} catch {
matt.Add(new ImageBrush());
}
}
}
///
/// Make texture for model.
///
/// NSBMD Model
private void MakeTexture(int i, NSBMDMaterial m) {
try {
if (m.format == 0) // format 0 is no texture
{
//matt.Add(new System.Windows.Media.ImageBrush());
return;
}
var mat = m;
if (mat is null || (mat.paldata is null && mat.format != 7)) {
//matt.Add(new System.Windows.Media.ImageBrush());
return;
}
int pixelnum = mat.width * mat.height;
var image = new RGBA[pixelnum];
switch (mat.format) {
// No Texture
case 0:
//puts( "ERROR: format 0" );
//mattt.Add(new System.Windows.Media.ImageBrush());
return;
// A3I5 Translucent Texture (3bit Alpha, 5bit Color Index)
case 1:
for (int j = 0; j < pixelnum; j++) {
int index = mat.texdata[j] & 0x1f;
int alpha = (mat.texdata[j] >> 5);// & 7;
alpha = ((alpha * 4) + (alpha / 2)) * 8;// << 3;
image[j] = mat.paldata[index];
image[j].A = (byte)alpha;
}
break;
// 4-Color Palette Texture
case 2:
if (mat.color0 != 0){ mat.paldata[0] = RGBA.Transparent; } // made palette entry 0 transparent
for (int j = 0; j < pixelnum; j++) {
uint index = mat.texdata[j / 4];
index = (index >> ((j % 4) << 1)) & 3;
image[j] = mat.paldata[index];
}
break;
// 16-Color Palette Texture
case 3:
if (mat.color0 != 0){ mat.paldata[0] = RGBA.Transparent; } // made palette entry 0 transparent
for (int j = 0; j < pixelnum; j++) {
var matindex = j / 2;
if (mat.texdata.Length < matindex)
continue;
int index = mat.texdata[matindex];
index = (index >> ((j % 2) << 2)) & 0x0f;
if (mat.paldata is null)
continue;
if (index < 0 || index >= mat.paldata.Length)
continue;
if (j < 0 || j >= pixelnum)
continue;
image[j] = mat.paldata[index];
}
break;
// 256-Color Palette Texture
case 4:
if (mat.color0 != 0){ mat.paldata[0] = RGBA.Transparent; } // made palette entry 0 transparent
// made palette entry 0 transparent
for (int j = 0; j < pixelnum; j++) {
image[j] = mat.paldata[mat.texdata[j]];
}
break;
// 4x4-Texel Compressed Texture
case 5:
convert_4x4texel_b(mat.texdata, mat.width, mat.height, mat.spdata, mat.paldata, image);
break;
// A5I3 Translucent Texture (5bit Alpha, 3bit Color Index)
case 6:
for (int j = 0; j < pixelnum; j++) {
int index = mat.texdata[j] & 0x7;
int alpha = (mat.texdata[j] >> 3);
alpha *= 8; //((alpha * 4) + (alpha / 2)) << 3;
image[j] = mat.paldata[index];
image[j].A = (byte)alpha;
}
break;
// Direct Color Texture
case 7:
for (int j = 0; j < pixelnum; j++) {
//ushort p = (ushort)(mat.texdata[j * 2] + (mat.texdata[j * 2 + 1] << 8));
//image[j].R = (byte)(((p >> 0) & 0x1f) << 3);
//image[j].G = (byte)(((p >> 5) & 0x1f) << 3);
//image[j].B = (byte)(((p >> 10) & 0x1f) << 3);
//image[j].A = (byte)(((p & 0x8000) != 0) ? 0xff : 0);
image[j] = RGBA.fromColor(Tinke.Convertir.BGR555ToColor(mat.texdata[j * 2], mat.texdata[j * 2 + 1]));
ushort p = (ushort)(mat.texdata[j * 2] + (mat.texdata[j * 2 + 1] << 8));
image[j].A = (byte)(((p & 0x8000) != 0) ? 0xff : 0);
}
break;
}
//Console.WriteLine("convert matid = {0}", i);
//Console.WriteLine("\ttex '{0}': {1} [{2},{3}] texsize = {4}", mat.texname, TEXTURE_FORMATS[mat.format], mat.width, mat.height, mat.texsize);
//Console.WriteLine("\tpal '{0}': pixelnum = {1}, repeat = {2}", mat.palname, pixelnum, mat.repeat);
var imageBytesList = new List();
//System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(mat.width, mat.height);
for (int k = 0; k < image.Length; ++k) {
//bitmap.SetPixel(k - ((k / (mat.width)) * (mat.width)), k / (mat.width), image[k].ToColor());
imageBytesList.Add(image[k].R);
imageBytesList.Add(image[k].G);
imageBytesList.Add(image[k].B);
//if (image[k].A != 0)
//{
// imageBytesList.Add((byte)(image[k].A - (255 - (((mat.Alpha + 1) * 8) - 1))));
//}
//else
//{
imageBytesList.Add((byte)(image[k].A));
//}
}
var imageBytes = imageBytesList.ToArray();
//ttt
Gl.glBindTexture(Gl.GL_TEXTURE_2D, i + 1 + matstart);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, mat.width, mat.height, 0, Gl.GL_RGBA,
Gl.GL_UNSIGNED_BYTE,
imageBytes);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
if (mat.flipS == 1 && mat.repeatS == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT);
} else if (mat.repeatS == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
} else {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
}
if (mat.flipT == 1 && mat.repeatT == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT);
} else if (mat.repeatT == 1) {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
} else {
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
}
} catch {
//matt.Add(new System.Windows.Media.ImageBrush());
}
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);
public static System.Windows.Media.Imaging.BitmapSource CreateBitmapSourceFromBitmap(System.Drawing.Bitmap bitmap) {
if (bitmap is null)
throw new ArgumentNullException("bitmap");
IntPtr hBitmap = bitmap.GetHbitmap();
try {
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
} finally {
DeleteObject(hBitmap);
}
}
private System.Windows.Media.Imaging.BitmapImage Bitmap2BitmapImage(System.Drawing.Bitmap dImg) {
MemoryStream ms = new MemoryStream();
dImg.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
System.Windows.Media.Imaging.BitmapImage bImg = new System.Windows.Media.Imaging.BitmapImage();
bImg.BeginInit();
bImg.StreamSource = ms;
bImg.EndInit();
return bImg;
}
///
/// Process polygon 3d commands.
///
/// Data of specific polygon.
private void Process3DCommand(byte[] polydata, NSBMDMaterial m, int jointID, bool color) {
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
MaterialHelper.CreateMaterial(new ImageBrush());
md.Add(new MeshBuilder());
IList poi = new List();
IList nor = new List();
IList tex = new List();
int typ = -1;
if (polydata is null)
return;
int commandptr = 0;
int commandlimit = polydata.Length;
int[] command = new int[4];
int cur_vertex, mode, i;
float[] vtx_state = { 0.0f, 0.0f, 0.0f };
float[] vtx_trans = { 0.0f, 0.0f, 0.0f };
cur_vertex = gCurrentVertex; // for vertex_mode
if (Model.Objects.Count > 0) {
CurrentMatrix = MatrixStack[stackID].Clone();
} else {
CurrentMatrix.LoadIdentity();
}
if (Model.Objects.Count > 1) {
//CurrentMatrix.Scale(Model.modelScale, Model.modelScale, Model.modelScale);
}
while (commandptr < commandlimit) {
for (i = 0; i < 4; ++i) {
if (commandptr >= commandlimit)
command[i] = 0xFF;
else {
command[i] = polydata[commandptr];
commandptr++;
}
}
for (i = 0; i < 4 && commandptr < commandlimit; i++) {
switch (command[i]) {
case 0: // No Operation (for padding packed GXFIFO commands)
break;
case 0x10: {
int param = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
switch (param) {
case 0:
// Gl.glMatrixMode(Gl.GL_PROJECTION_MATRIX);
break;
case 1:
// Gl.glMatrixMode(Gl.GL_MODELVIEW_MATRIX);
break;
case 2:
break;
case 3:
// Gl.glMatrixMode(Gl.GL_TEXTURE_MATRIX);
break;
}
break;
}
case 0x11: break;
case 0x12: commandptr += 4; break;
case 0x13: commandptr += 4; break;
case 0x14:
/*
MTX_RESTORE - Restore Current Matrix from Stack (W)
Sets C=[N]. The stack pointer S is not used, and is left unchanged.
Parameter Bit0-4: Stack Address (0..30) (31 causes overflow in GXSTAT.15)
Parameter Bit5-31: Not used
*/
stackID = Utils.Read4BytesAsInt32(polydata, commandptr) & 0x1F;// & 0x0000001F;
commandptr += 4;
MatrixStack[stackID].CopyValuesTo(CurrentMatrix);
break;
case 0x15: {
CurrentMatrix.LoadIdentity();
break;
}
case 0x16: {
for (int j = 0; j < 16; j++) {
CurrentMatrix[j] = (float)Utils.Read4BytesAsInt32(polydata, commandptr) / 4096f;
commandptr += 4;
}
break;
}
case 0x17: {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 3; j++) {
CurrentMatrix[k, j] = (float)Utils.Read4BytesAsInt32(polydata, commandptr) / 4096f;
commandptr += 4;
}
}
break;
}
case 0x18: {
MTX44 f = new MTX44();
f.LoadIdentity();
for (int j = 0; j < 16; j++) {
f[j] = (float)Utils.Read4BytesAsInt32(polydata, commandptr) / 4096f;
commandptr += 4;
}
CurrentMatrix.MultMatrix(f).CopyValuesTo(CurrentMatrix);
break;
}
case 0x19: {
MTX44 f = new MTX44();
f.LoadIdentity();
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 3; j++) {
f[k, j] = (float)Utils.Read4BytesAsInt32(polydata, commandptr) / 4096f;
commandptr += 4;
}
}
CurrentMatrix.MultMatrix(f).CopyValuesTo(CurrentMatrix);
break;
}
case 0x1A: {
MTX44 f = new MTX44();
f.LoadIdentity();
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; j++) {
f[k, j] = (float)Utils.Read4BytesAsInt32(polydata, commandptr) / 4096f;
commandptr += 4;
}
}
CurrentMatrix.MultMatrix(f).CopyValuesTo(CurrentMatrix);
break;
}
case 0x1b:
/*
MTX_SCALE - Multiply Current Matrix by Scale Matrix (W)
Sets C=M*C. Parameters: 3, m[0..2] (MTX_SCALE doesn't change Vector Matrix)
*/
{
int x, y, z;
x = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
y = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
z = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
//CurrentMatrix[0] = (float)sign(x, 32) / SCALE_IV;
//CurrentMatrix[5] = (float)sign(y, 32) / SCALE_IV;
//CurrentMatrix[10] = (float)sign(z, 32) / SCALE_IV;
//CurrentMatrix.SetValues(scale(CurrentMatrix.Floats, x, y, z));
CurrentMatrix.Scale((float)x / SCALE_IV / Model.modelScale, (float)y / SCALE_IV / Model.modelScale, (float)z / SCALE_IV / Model.modelScale);
//CurrentMatrix.Scale((float)sign(x, 32) / SCALE_IV, (float)sign(y, 32) / SCALE_IV, (float)sign(z, 32) / SCALE_IV);
break;
}
case 0x1c:
/*
MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W)
Sets C=M*C. Parameters: 3, m[0..2] (x,y,z position)
*/
{
int x, y, z;
x = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
y = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
z = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
CurrentMatrix.translate((float)Sign(x, 32) / SCALE_IV / Model.modelScale, (float)Sign(y, 32) / SCALE_IV / Model.modelScale, (float)Sign(z, 32) / SCALE_IV / Model.modelScale);
break;
}
case 0x20: // Directly Set Vertex Color (W)
{
Int64 rgb, r, g, b;
rgb = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
if (gOptColoring) {
r = (rgb >> 0) & 0x1F;
g = (rgb >> 5) & 0x1F;
b = (rgb >> 10) & 0x1F;
if (color) {
Gl.glColor4f(((float)r) / 31.0f, ((float)g) / 31.0f, ((float)b) / 31.0f, m.Alpha / 31.0f);
}
}
}
break;
case 0x21:
/*
Set Normal Vector (W)
0-9 X-Component of Normal Vector (1bit sign + 9bit fractional part)
10-19 Y-Component of Normal Vector (1bit sign + 9bit fractional part)
20-29 Z-Component of Normal Vector (1bit sign + 9bit fractional part)
30-31 Not used
*/
{
Int64 xyz, x, y, z;
xyz = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
x = (xyz >> 0) & 0x3FF;
if ((x & 0x200) != 0)
x |= -1024;
y = (xyz >> 10) & 0x3FF;
if ((y & 0x200) != 0){ y |= -1024; }
z = (xyz >> 20) & 0x3FF;
if ((z & 0x200) != 0){ z |= -1024; }
Gl.glNormal3f(((float)x) / 512.0f, ((float)y) / 512.0f, ((float)z) / 512.0f);
if (writevertex) {
//normals.Add(new float[] { ((float)x) / 512.0f, ((float)y) / 512.0f, ((float)z) / 512.0f });
//mod.Normals.Add(new System.Windows.Media.Media3D.Vector3D(((float)x) / 512.0f, ((float)y) / 512.0f, ((float)z) / 512.0f))
nor.Add(new System.Windows.Media.Media3D.Vector3D(((float)x) / 512.0f, ((float)y) / 512.0f, ((float)z) / 512.0f));
}
break;
}
case 0x22:
/*
Set Texture Coordinates (W)
Parameter 1, Bit 0-15 S-Coordinate (X-Coordinate in Texture Source)
Parameter 1, Bit 16-31 T-Coordinate (Y-Coordinate in Texture Source)
Both values are 1bit sign + 11bit integer + 4bit fractional part.
A value of 1.0 (=1 SHL 4) equals to one Texel.
*/
{
Int64 st, s, t;
st = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
s = (st >> 0) & 0xffff;
if ((s & 0x8000) != 0){ s |= unchecked((int)0xFFFF0000); }//-65536;
t = (st >> 16) & 0xffff;
if ((t & 0x8000) != 0){ t |= unchecked((int)0xFFFF0000); }//-65536;
Gl.glTexCoord2f(((float)s) / 16.0f, ((float)t) / 16.0f);
if (writevertex) {
//mod.TextureCoordinates.Add(new System.Windows.Point((float)s/1024f,(float)t/1024f));
tex.Add(new System.Windows.Point(((float)m.scaleS / (float)m.width) * ((float)s / 16f) / (m.flipS + 1), -((float)m.scaleT / (float)m.height) * ((float)t / 16f) / (m.flipT + 1)));
}
break;
}
case 0x23:
/*
VTX_16 - Set Vertex XYZ Coordinates (W)
Parameter 1, Bit 0-15 X-Coordinate (signed, with 12bit fractional part)
Parameter 1, Bit 16-31 Y-Coordinate (signed, with 12bit fractional part)
Parameter 2, Bit 0-15 Z-Coordinate (signed, with 12bit fractional part)
Parameter 2, Bit 16-31 Not used
*/
{
int parameter, x, y, z;
parameter = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
x = Sign((parameter >> 0) & 0xFFFF, 16);
//if ((x & 0x8000) != 0){ x |= unchecked((int)0xFFFF0000); }//-65536;
y = Sign((parameter >> 16) & 0xFFFF, 16);
//if ((y & 0x8000) != 0){ y |= unchecked((int)0xFFFF0000); }//-65536;
parameter = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
z = Sign(parameter & 0xFFFF, 16);
// if ((z & 0x8000) != 0){ z |= unchecked((int)0xFFFF0000); }//-65536;
vtx_state[0] = ((float)x) / SCALE_IV;
vtx_state[1] = ((float)y) / SCALE_IV;
vtx_state[2] = ((float)z) / SCALE_IV;
if (stackID != -1) {
vtx_trans = CurrentMatrix.MultVector(vtx_state);
Gl.glVertex3fv(vtx_trans);
if (writevertex) {
//vertex.Add(vtx_trans);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
} else {
Gl.glVertex3fv(vtx_state);
if (writevertex) {
//vertex.Add(vtx_state);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
}
if (writevertex) {
//vertex_normal.Add((normals.Count == 0 ? -1 : normals.Count));
}
break;
}
case 0x24:
/*
VTX_10 - Set Vertex XYZ Coordinates (W)
Parameter 1, Bit 0-9 X-Coordinate (signed, with 6bit fractional part)
Parameter 1, Bit 10-19 Y-Coordinate (signed, with 6bit fractional part)
Parameter 1, Bit 20-29 Z-Coordinate (signed, with 6bit fractional part)
Parameter 1, Bit 30-31 Not used
*/
{
int xyz, x, y, z;
xyz = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
x = Sign((xyz >> 0) & 0x3FF, 10);
// if ((x & 0x200) != 0){ x |= unchecked((int)0xFFFFFC00); }//-1024;
y = Sign((xyz >> 10) & 0x3FF, 10);
//if ((y & 0x200) != 0){ y |= unchecked((int)0xFFFFFC00); }//-1024;
z = Sign((xyz >> 20) & 0x3FF, 10);
// if ((z & 0x200) != 0){ z |= unchecked((int)0xFFFFFC00); }//-1024;
vtx_state[0] = (float)x / 64.0f;
vtx_state[1] = (float)y / 64.0f;
vtx_state[2] = (float)z / 64.0f;
if (stackID != -1) {
vtx_trans = CurrentMatrix.MultVector(vtx_state);
Gl.glVertex3fv(vtx_trans);
if (writevertex) {
//vertex.Add(vtx_trans);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
} else {
Gl.glVertex3fv(vtx_state);
if (writevertex) {
//vertex.Add(vtx_state);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
}
if (writevertex) {
//vertex_normal.Add((normals.Count == 0 ? -1 : normals.Count));
}
break;
}
case 0x25:
/*
VTX_XY - Set Vertex XY Coordinates (W)
Parameter 1, Bit 0-15 X-Coordinate (signed, with 12bit fractional part)
Parameter 1, Bit 16-31 Y-Coordinate (signed, with 12bit fractional part)
*/
{
int xy, x, y;
xy = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
x = Sign((xy >> 0) & 0xFFFF, 16);
//if ((x & 0x8000) != 0){ x |= unchecked((int)0xFFFF0000); }//-65536;
y = Sign((xy >> 16) & 0xFFFF, 16);
//if ((y & 0x8000) != 0){ y |= unchecked((int)0xFFFF0000); }//-65536;
vtx_state[0] = ((float)x) / SCALE_IV;
vtx_state[1] = ((float)y) / SCALE_IV;
if (stackID != -1) {
vtx_trans = CurrentMatrix.MultVector(vtx_state);
Gl.glVertex3fv(vtx_trans);
if (writevertex) {
//vertex.Add(vtx_trans);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
} else {
Gl.glVertex3fv(vtx_state);
if (writevertex) {
//vertex.Add(vtx_state);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
}
if (writevertex) {
//vertex_normal.Add((normals.Count == 0 ? -1 : normals.Count));
}
break;
}
case 0x26:
/*
VTX_XZ - Set Vertex XZ Coordinates (W)
Parameter 1, Bit 0-15 X-Coordinate (signed, with 12bit fractional part)
Parameter 1, Bit 16-31 Z-Coordinate (signed, with 12bit fractional part)
*/
{
int xz, x, z;
xz = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
x = Sign((xz >> 0) & 0xFFFF, 16);
// if ((x & 0x8000) != 0){ x |= unchecked((int)0xFFFF0000); }//-65536;
z = Sign((xz >> 16) & 0xFFFF, 16);
// if ((z & 0x8000) != 0){ z |= unchecked((int)0xFFFF0000); }//-65536;
vtx_state[0] = ((float)x) / SCALE_IV;
vtx_state[2] = ((float)z) / SCALE_IV;
if (stackID != -1) {
vtx_trans = CurrentMatrix.MultVector(vtx_state);
Gl.glVertex3fv(vtx_trans);
if (writevertex) {
//vertex.Add(vtx_trans);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
} else {
Gl.glVertex3fv(vtx_state);
if (writevertex) {
//vertex.Add(vtx_state);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
}
if (writevertex) {
// vertex_normal.Add((normals.Count == 0 ? -1 : normals.Count));
}
break;
}
case 0x27:
/*
VTX_YZ - Set Vertex YZ Coordinates (W)
Parameter 1, Bit 0-15 Y-Coordinate (signed, with 12bit fractional part)
Parameter 1, Bit 16-31 Z-Coordinate (signed, with 12bit fractional part)
*/
{
int yz, y, z;
yz = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
y = Sign((yz >> 0) & 0xFFFF, 16);
//if ((y & 0x8000) != 0){ y |= unchecked((int)0xFFFF0000); }//-65536;
z = Sign((yz >> 16) & 0xFFFF, 16);
//if ((z & 0x8000) != 0){ z |= unchecked((int)0xFFFF0000); }//-65536;
vtx_state[1] = ((float)y) / SCALE_IV;
vtx_state[2] = ((float)z) / SCALE_IV;
if (stackID != -1) {
vtx_trans = CurrentMatrix.MultVector(vtx_state);
Gl.glVertex3fv(vtx_trans);
if (writevertex) {
//vertex.Add(vtx_trans);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
} else {
Gl.glVertex3fv(vtx_state);
if (writevertex) {
//vertex.Add(vtx_state);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
}
if (writevertex) {
//vertex_normal.Add((normals.Count == 0 ? -1 : normals.Count));
}
break;
}
case 0x28:
/*
VTX_DIFF - Set Relative Vertex Coordinates (W)
Parameter 1, Bit 0-9 X-Difference (signed, with 9bit fractional part)
Parameter 1, Bit 10-19 Y-Difference (signed, with 9bit fractional part)
Parameter 1, Bit 20-29 Z-Difference (signed, with 9bit fractional part)
Parameter 1, Bit 30-31 Not used
*/
{
int xyz, x, y, z;
xyz = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
x = Sign((xyz >> 0) & 0x3FF, 10);
//if ((x & 0x200) != 0){ x |= unchecked((int)0xFFFFFC00); }//-1024;
y = Sign((xyz >> 10) & 0x3FF, 10);
//if ((y & 0x200) != 0){ y |= unchecked((int)0xFFFFFC00); }
z = Sign((xyz >> 20) & 0x3FF, 10);
//if ((z & 0x200) != 0){ z |= unchecked((int)0xFFFFFC00); }
vtx_state[0] += ((float)x) / SCALE_IV;
vtx_state[1] += ((float)y) / SCALE_IV;
vtx_state[2] += ((float)z) / SCALE_IV;
if (stackID != -1) {
vtx_trans = CurrentMatrix.MultVector(vtx_state);
Gl.glVertex3fv(vtx_trans);
if (writevertex) {
//vertex.Add(vtx_trans);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_trans[0], vtx_trans[1], vtx_trans[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
} else {
Gl.glVertex3fv(vtx_state);
if (writevertex) {
//vertex.Add(vtx_state);
//mod.Positions.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
poi.Add(new System.Windows.Media.Media3D.Point3D(vtx_state[0], vtx_state[1], vtx_state[2]));
if (poi.Count > tex.Count && tex.Count != 0) {
tex.Add(tex[tex.Count - 1]);//new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
} else if (tex.Count == 0) {
tex.Add(new System.Windows.Point(double.NegativeInfinity, double.PositiveInfinity));
}
if (poi.Count > nor.Count && nor.Count != 0) {
nor.Add(nor[nor.Count - 1]);
} else if (nor.Count == 0) {
nor.Add(new System.Windows.Media.Media3D.Vector3D(double.NegativeInfinity, double.PositiveInfinity, 0));
}
}
}
if (writevertex) {
// vertex_normal.Add((normals.Count == 0 ? -1 : normals.Count));
}
break;
}
case 0x29: {
int param = Utils.Read4BytesAsInt32(polydata, commandptr);
commandptr += 4;
/*int light = (param >> 0) & 0x10;
int polygonMode = (param >> 4) & 0x4;
switch (polygonMode)
{
case 0:
mode = Gl.GL_MODULATE;
break;
case 1:
mode = Gl.GL_DECAL;
break;
case 2:
mode = Gl.GL_SHADOW_AMBIENT_SGIX;
break;
case 3:
mode = Gl.GL_QUAD_STRIP;
break;
default:
//return ;// FALSE;
throw new Exception();
break;
}*/
break;
}
case 0x2A: commandptr += 4; break;
case 0x2B: commandptr += 4; break;
// lighting commands
case 0x30: commandptr += 4; break;
case 0x31: commandptr += 4; break;
case 0x32: commandptr += 4; break;
case 0x33: {
commandptr += 4;
break;
}
case 0x34: commandptr += 128; break;
case 0x40: // Start of Vertex List (W)
{
mode = Utils.Read4BytesAsInt32(polydata, commandptr);
//mode = mode & 0x3;
commandptr += 4;
typ = mode;
switch (mode) {
case 0:
mode = Gl.GL_TRIANGLES;
break;
case 1:
mode = Gl.GL_QUADS;
break;
case 2:
mode = Gl.GL_TRIANGLE_STRIP;
break;
case 3:
mode = Gl.GL_QUAD_STRIP;
break;
default:
//return ;// FALSE;
throw new Exception();
}
Gl.glBegin(mode);
break;
}
case 0x41:
Gl.glEnd();
if (writevertex) {
switch (typ) {
case 0: {
for (int j = 0; j < poi.Count / 3; j++) {
if (tex.Count > j * 3 + 2) {
md[md.Count - 1].AddTriangle(poi[j * 3], poi[j * 3 + 1], poi[j * 3 + 2], tex[j * 3], tex[j * 3 + 1], tex[j * 3 + 2]);
} else {
md[md.Count - 1].AddTriangle(poi[j * 3], poi[j * 3 + 1], poi[j * 3 + 2]);
}
}
break;
}
case 1: {
for (int j = 0; j < poi.Count / 4; j++) {
if (tex.Count > j * 4 + 3) {
md[md.Count - 1].AddQuad(poi[j * 4], poi[j * 4 + 1], poi[j * 4 + 2], poi[j * 4 + 3], tex[j * 4], tex[j * 4 + 1], tex[j * 4 + 2], tex[j * 4 + 3]);
} else {
md[md.Count - 1].AddQuad(poi[j * 4], poi[j * 4 + 1], poi[j * 4 + 2], poi[j * 4 + 3]);
}
}
break;
}
case 2: {
while (poi.Count > nor.Count) {
nor.Add(nor[nor.Count - 1]);
}
while (poi.Count > tex.Count) {
tex.Add(tex[tex.Count - 1]);
}
md[md.Count - 1].AddTriangles(poi, nor, tex);
//md[mo].AddTriangleStrip(poi, nor, tex);
break;
}
case 3: {
while (poi.Count > nor.Count) {
nor.Add(nor[nor.Count - 1]);
}
while (poi.Count > tex.Count) {
tex.Add(tex[tex.Count - 1]);
}
md[md.Count - 1].AddQuads(poi, nor, tex);
//md.AddQuads(poi, nor, tex);
break;
}
default:
//return ;// FALSE;
break;
}
}
nor.Clear();
tex.Clear();
poi.Clear();
//nr++;
// for vertex mode, display at maximum certain number of vertex-list
// decrease cur_vertex so that when we reach 0, stop rendering any further
cur_vertex--;
if (cur_vertex < 0 && gOptVertexMode)
return; //TRUE;
break;
case 0x50: commandptr += 4; break;
case 0x60: commandptr += 4; break;
case 0x70: commandptr += 12; break;
case 0x71: commandptr += 8; break;
case 0x72: commandptr += 4; break;
default:
break;
//return FALSE;
}
}
}
}
public static int Sign(int data, int size) {
if ((data & 1 << size - 1) != 0)
data |= -1 << size;
return data;
}
///
/// Process polygon 3d commands.
///
/// Data of specific polygon.
public void ClearOBJ() {
md.Clear();
writevertex = true;
}
public void RipModel(string file) {
NSBMDPolygon polygon;
int matId;
NSBMDMaterial material;
int num3;
DiffuseMaterial material2;
MeshBuilder builder;
Model3D modeld;
MTX44 mtx = new MTX44();
List list = new List();
List list2 = new List();
for (int i = 0; i < (this.Model.Polygons.Count - 1); i++) {
polygon = this.Model.Polygons[i];
matId = polygon.MatId;
material = this.Model.Materials[matId];
}
MTX44 mtx2 = new MTX44();
mtx2.LoadIdentity();
for (num3 = 0; num3 < this.Model.Objects.Count; num3++) {
NSBMDObject obj2 = this.Model.Objects[num3];
float[] transVect = obj2.TransVect;
float[] numArray2 = loadIdentity();
if (obj2.RestoreID != -1) {
mtx2 = MatrixStack[obj2.RestoreID];
}
if (obj2.StackID != -1) {
if (obj2.visible) {
MTX44 b = new MTX44();
b.SetValues(obj2.materix);
mtx2 = mtx2.MultMatrix(b);
} else {
mtx2.Zero();
}
MatrixStack[obj2.StackID] = mtx2;
stackID = obj2.StackID;
float[] numArray3 = mtx2.MultVector(new float[3]);
list2.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
}
}
num3 = 0;
while (num3 < (this.Model.Polygons.Count - 1)) {
polygon = this.Model.Polygons[num3];
if ((gOptTexture && !gOptWireFrame) && g_mat) {
matId = polygon.MatId;
if (matId == -1) {
this.mattt.Add(new ImageBrush());
} else {
this.mattt.Add(this.matt[matId]);
material = this.Model.Materials[matId];
}
}
stackID = polygon.StackID;
list.Add(Process3DCommandRipper(polygon.PolyData, Model.Materials[polygon.MatId], polygon.JointID, true));
num3++;
}
File.Create(file).Close();
ObjExporter exporter = new ObjExporter(file, "Created with Alloy Universal Repo Editor " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
int index = 0;
foreach (Group group in list) {
ImageBrush brush = new ImageBrush();
try {
brush.ImageSource = this.mattt[index].ImageSource;
brush.Opacity = this.mattt[index].Opacity;
brush.Viewbox = this.mattt[index].Viewbox;
brush.ViewboxUnits = this.mattt[index].ViewboxUnits;
brush.Viewport = this.mattt[index].Viewport;
brush.ViewportUnits = this.mattt[index].ViewportUnits;
} catch {
}
if (brush.ImageSource != null) {
material2 = new DiffuseMaterial(brush);
} else {
material2 = new DiffuseMaterial(new SolidColorBrush());
}
material2.SetValue(matName, this.Model.Materials[this.Model.Polygons[index].MatId].MaterialName);
material2.SetValue(polyName, this.Model.Polygons[index].Name);
material2.Brush.Opacity = ((float)this.Model.Materials[this.Model.Polygons[index].MatId].Alpha) / 31f;
material2.AmbientColor = Color.FromArgb(this.Model.Materials[this.Model.Polygons[index].MatId].AmbientColor.A, this.Model.Materials[this.Model.Polygons[index].MatId].AmbientColor.R, this.Model.Materials[this.Model.Polygons[index].MatId].AmbientColor.G, this.Model.Materials[this.Model.Polygons[index].MatId].AmbientColor.B);
material2.Color = Color.FromArgb(0xff, this.Model.Materials[this.Model.Polygons[index].MatId].DiffuseColor.R, this.Model.Materials[this.Model.Polygons[index].MatId].DiffuseColor.G, this.Model.Materials[this.Model.Polygons[index].MatId].DiffuseColor.B);
builder = new MeshBuilder();
foreach (MKDS_Course_Editor.Export3DTools.Polygon polygon2 in group) {
IList list3;
IList list4;
IList list5;
switch (polygon2.PolyType) {
case PolygonType.Triangle:
list3 = new List();
list4 = new List();
list5 = new List();
num3 = 0;
goto Label_08AB;
case PolygonType.Quad:
list3 = new List();
list4 = new List();
list5 = new List();
num3 = 0;
goto Label_0C5E;
case PolygonType.TriangleStrip:
list3 = new List();
list4 = new List();
list5 = new List();
num3 = 0;
goto Label_0D66;
case PolygonType.QuadStrip:
list3 = new List();
list4 = new List();
list5 = new List();
num3 = 0;
goto Label_0E7C;
default: {
continue;
}
}
Label_0608:
list3.Add(new Point3D((double)polygon2.Vertex[num3].X, (double)polygon2.Vertex[num3].Y, (double)polygon2.Vertex[num3].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3].X, (double)polygon2.Normals[num3].Y, (double)polygon2.Normals[num3].Z));
list5.Add(new System.Windows.Point((double)polygon2.TexCoords[num3].X, (double)polygon2.TexCoords[num3].Y));
list3.Add(new Point3D((double)polygon2.Vertex[num3 + 1].X, (double)polygon2.Vertex[num3 + 1].Y, (double)polygon2.Vertex[num3 + 1].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3 + 1].X, (double)polygon2.Normals[num3 + 1].Y, (double)polygon2.Normals[num3 + 1].Z));
list5.Add(new Point((double)polygon2.TexCoords[num3 + 1].X, (double)polygon2.TexCoords[num3 + 1].Y));
list3.Add(new Point3D((double)polygon2.Vertex[num3 + 2].X, (double)polygon2.Vertex[num3 + 2].Y, (double)polygon2.Vertex[num3 + 2].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3 + 2].X, (double)polygon2.Normals[num3 + 2].Y, (double)polygon2.Normals[num3 + 2].Z));
list5.Add(new Point((double)polygon2.TexCoords[num3 + 2].X, (double)polygon2.TexCoords[num3 + 2].Y));
builder.AddTriangles(list3, list4, list5);
list3.Clear();
list4.Clear();
list5.Clear();
num3 += 3;
Label_08AB:
if (num3 < polygon2.Vertex.Length) {
goto Label_0608;
}
continue;
Label_08E4:
list3.Add(new Point3D((double)polygon2.Vertex[num3].X, (double)polygon2.Vertex[num3].Y, (double)polygon2.Vertex[num3].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3].X, (double)polygon2.Normals[num3].Y, (double)polygon2.Normals[num3].Z));
list5.Add(new System.Windows.Point((double)polygon2.TexCoords[num3].X, (double)polygon2.TexCoords[num3].Y));
list3.Add(new Point3D((double)polygon2.Vertex[num3 + 1].X, (double)polygon2.Vertex[num3 + 1].Y, (double)polygon2.Vertex[num3 + 1].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3 + 1].X, (double)polygon2.Normals[num3 + 1].Y, (double)polygon2.Normals[num3 + 1].Z));
list5.Add(new System.Windows.Point((double)polygon2.TexCoords[num3 + 1].X, (double)polygon2.TexCoords[num3 + 1].Y));
list3.Add(new Point3D((double)polygon2.Vertex[num3 + 2].X, (double)polygon2.Vertex[num3 + 2].Y, (double)polygon2.Vertex[num3 + 2].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3 + 2].X, (double)polygon2.Normals[num3 + 2].Y, (double)polygon2.Normals[num3 + 2].Z));
list5.Add(new System.Windows.Point((double)polygon2.TexCoords[num3 + 2].X, (double)polygon2.TexCoords[num3 + 2].Y));
list3.Add(new Point3D((double)polygon2.Vertex[num3 + 3].X, (double)polygon2.Vertex[num3 + 3].Y, (double)polygon2.Vertex[num3 + 3].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3 + 3].X, (double)polygon2.Normals[num3 + 3].Y, (double)polygon2.Normals[num3 + 3].Z));
list5.Add(new System.Windows.Point((double)polygon2.TexCoords[num3 + 3].X, (double)polygon2.TexCoords[num3 + 3].Y));
builder.AddQuads(list3, list4, list5);
list3.Clear();
list4.Clear();
list5.Clear();
num3 += 4;
Label_0C5E:
if (num3 < polygon2.Vertex.Length) {
goto Label_08E4;
}
continue;
Label_0C97:
list3.Add(new Point3D((double)polygon2.Vertex[num3].X, (double)polygon2.Vertex[num3].Y, (double)polygon2.Vertex[num3].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3].X, (double)polygon2.Normals[num3].Y, (double)polygon2.Normals[num3].Z));
list5.Add(new Point((double)polygon2.TexCoords[num3].X, (double)polygon2.TexCoords[num3].Y));
num3++;
Label_0D66:
if (num3 < polygon2.Vertex.Length) {
goto Label_0C97;
}
builder.AddTriangleStrip(list3, list4, list5);
continue;
Label_0DAD:
list3.Add(new Point3D((double)polygon2.Vertex[num3].X, (double)polygon2.Vertex[num3].Y, (double)polygon2.Vertex[num3].Z));
list4.Add(new Vector3D((double)polygon2.Normals[num3].X, (double)polygon2.Normals[num3].Y, (double)polygon2.Normals[num3].Z));
list5.Add(new System.Windows.Point((double)polygon2.TexCoords[num3].X, (double)polygon2.TexCoords[num3].Y));
num3++;
Label_0E7C:
if (num3 < polygon2.Vertex.Length) {
goto Label_0DAD;
}
builder.AddTriangleStrip(list3, list4, list5);
}
modeld = new GeometryModel3D(builder.ToMesh(false), material2);
exporter.Export(modeld);
index++;
}
exporter.Close();
this.writevertex = false;
}
private Group Process3DCommandRipper(byte[] polydata, NSBMDMaterial m, int jointID, bool color) {
Group group = new Group();
Vector3 item = new Vector3(float.NaN, 0f, 0f);
System.Drawing.Color white = System.Drawing.Color.White;
Vector2 vector2 = new Vector2(float.NaN, 0f);
List list = new List();
List list2 = new List();
List list3 = new List();
int num = -1;
if (polydata != null) {
int index = 0;
int length = polydata.Length;
int[] numArray = new int[4];
float[] numArray4 = new float[3];
float[] v = numArray4;
numArray4 = new float[3];
float[] numArray3 = numArray4;
int gCurrentVertex = NSBMDGlRenderer.gCurrentVertex;
if (this.Model.Objects.Count > 0) {
CurrentMatrix = MatrixStack[stackID].Clone();
} else {
CurrentMatrix.LoadIdentity();
}
if (this.Model.Objects.Count > 1) {
}
while (index < length) {
int num7 = 0;
while (num7 < 4) {
if (index >= length) {
numArray[num7] = 0xff;
} else {
numArray[num7] = polydata[index];
index++;
}
num7++;
}
for (num7 = 0; (num7 < 4) && (index < length); num7++) {
int num6;
int num8;
int num9;
int num10;
MTX44 mtx;
int num11;
int num12;
int num13;
int num26;
switch (numArray[num7]) {
case 0x70: {
index += 12;
continue;
}
case 0x71: {
index += 8;
continue;
}
case 0x72: {
index += 4;
continue;
}
case 0x60: {
index += 4;
continue;
}
case 80: {
index += 4;
continue;
}
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 0x1d:
case 30:
case 0x1f:
case 0x2c:
case 0x2d:
case 0x2e:
case 0x2f:
case 0x11: {
continue;
}
case 0x10: {
num8 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
continue;
}
case 0x12: {
index += 4;
continue;
}
case 0x13: {
index += 4;
continue;
}
case 20: {
stackID = Utils.Read4BytesAsInt32(polydata, index) & 0x1f;
index += 4;
MatrixStack[stackID].CopyValuesTo(CurrentMatrix);
continue;
}
case 0x15: {
CurrentMatrix.LoadIdentity();
continue;
}
case 0x16: {
num9 = 0;
while (num9 < 0x10) {
CurrentMatrix[num9] = ((float)Utils.Read4BytesAsInt32(polydata, index)) / 4096f;
index += 4;
num9++;
}
continue;
}
case 0x17:
num9 = 0;
goto Label_039C;
case 0x18:
mtx = new MTX44();
mtx.LoadIdentity();
num9 = 0;
goto Label_03E8;
case 0x19:
mtx = new MTX44();
mtx.LoadIdentity();
num9 = 0;
goto Label_0466;
case 0x1a:
mtx = new MTX44();
mtx.LoadIdentity();
num9 = 0;
goto Label_04E3;
case 0x1b: {
num11 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num12 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num13 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
CurrentMatrix.Scale((((float)num11) / 4096f) / this.Model.modelScale, (((float)num12) / 4096f) / this.Model.modelScale, (((float)num13) / 4096f) / this.Model.modelScale);
continue;
}
case 0x1c: {
num11 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num12 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num13 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
CurrentMatrix.translate((((float)Sign(num11, 0x20)) / 4096f) / this.Model.modelScale, (((float)Sign(num12, 0x20)) / 4096f) / this.Model.modelScale, (((float)Sign(num13, 0x20)) / 4096f) / this.Model.modelScale);
continue;
}
case 0x20: {
long num14 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
if (gOptColoring) {
long num15 = num14 & 0x1fL;
long num16 = (num14 >> 5) & 0x1fL;
long num17 = (num14 >> 10) & 0x1fL;
if (color) {
white = System.Drawing.Color.FromArgb((int)(((float)m.Alpha) / 31f), (int)(((float)num15) / 31f), (int)(((float)num16) / 31f), (int)(((float)num17) / 31f));
}
}
continue;
}
case 0x21: {
long num18 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
long num19 = num18 & 0x3ffL;
if ((num19 & 0x200L) != 0L) {
num19 |= -1024L;
}
long num20 = (num18 >> 10) & 0x3ffL;
if ((num20 & 0x200L) != 0L) {
num20 |= -1024L;
}
long num21 = (num18 >> 20) & 0x3ffL;
if ((num21 & 0x200L) != 0L) {
num21 |= -1024L;
}
item = new Vector3(((float)num19) / 512f, ((float)num20) / 512f, ((float)num21) / 512f);
continue;
}
case 0x22: {
long num22 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
long num23 = num22 & 0xffffL;
if ((num23 & 0x8000L) != 0L) {
num23 |= -65536L;
}
long num24 = (num22 >> 0x10) & 0xffffL;
if ((num24 & 0x8000L) != 0L) {
num24 |= -65536L;
}
vector2 = new Vector2(((m.scaleS / ((float)m.width)) * (((float)num23) / 16f)) / ((float)(m.flipS + 1)), (-(m.scaleT / ((float)m.height)) * (((float)num24) / 16f)) / ((float)(m.flipT + 1)));
continue;
}
case 0x23: {
int num25 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num11 = Sign(num25 & 0xffff, 0x10);
num12 = Sign((num25 >> 0x10) & 0xffff, 0x10);
num25 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num13 = Sign(num25 & 0xffff, 0x10);
v[0] = ((float)num11) / 4096f;
v[1] = ((float)num12) / 4096f;
v[2] = ((float)num13) / 4096f;
if (stackID == -1) {
goto Label_08E2;
}
numArray3 = CurrentMatrix.MultVector(v);
list.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
list2.Add(item);
list3.Add(vector2);
goto Label_090F;
}
case 0x24:
num26 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num11 = Sign(num26 & 0x3ff, 10);
num12 = Sign((num26 >> 10) & 0x3ff, 10);
num13 = Sign((num26 >> 20) & 0x3ff, 10);
v[0] = ((float)num11) / 64f;
v[1] = ((float)num12) / 64f;
v[2] = ((float)num13) / 64f;
if (stackID == -1) {
goto Label_09E1;
}
numArray3 = CurrentMatrix.MultVector(v);
list.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
list2.Add(item);
list3.Add(vector2);
goto Label_0A0E;
case 0x25: {
int num27 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num11 = Sign(num27 & 0xffff, 0x10);
num12 = Sign((num27 >> 0x10) & 0xffff, 0x10);
v[0] = ((float)num11) / 4096f;
v[1] = ((float)num12) / 4096f;
if (stackID == -1) {
goto Label_0ABF;
}
numArray3 = CurrentMatrix.MultVector(v);
list.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
list2.Add(item);
list3.Add(vector2);
goto Label_0AEC;
}
case 0x26: {
int num28 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num11 = Sign(num28 & 0xffff, 0x10);
num13 = Sign((num28 >> 0x10) & 0xffff, 0x10);
v[0] = ((float)num11) / 4096f;
v[2] = ((float)num13) / 4096f;
if (stackID == -1) {
goto Label_0B9D;
}
numArray3 = CurrentMatrix.MultVector(v);
list.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
list2.Add(item);
list3.Add(vector2);
goto Label_0BCA;
}
case 0x27: {
int num29 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num12 = Sign(num29 & 0xffff, 0x10);
num13 = Sign((num29 >> 0x10) & 0xffff, 0x10);
v[1] = ((float)num12) / 4096f;
v[2] = ((float)num13) / 4096f;
if (stackID == -1) {
goto Label_0C7B;
}
numArray3 = CurrentMatrix.MultVector(v);
list.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
list2.Add(item);
list3.Add(vector2);
goto Label_0CA8;
}
case 40:
num26 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num11 = Sign(num26 & 0x3ff, 10);
num12 = Sign((num26 >> 10) & 0x3ff, 10);
num13 = Sign((num26 >> 20) & 0x3ff, 10);
v[0] += ((float)num11) / 4096f;
v[1] += ((float)num12) / 4096f;
v[2] += ((float)num13) / 4096f;
if (stackID == -1) {
goto Label_0DAA;
}
numArray3 = CurrentMatrix.MultVector(v);
list.Add(new Vector3(numArray3[0], numArray3[1], numArray3[2]));
list2.Add(item);
list3.Add(vector2);
goto Label_0DD7;
case 0x29: {
num8 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
continue;
}
case 0x2a: {
index += 4;
continue;
}
case 0x2b: {
index += 4;
continue;
}
case 0x30: {
index += 4;
continue;
}
case 0x31: {
index += 4;
continue;
}
case 50: {
index += 4;
continue;
}
case 0x33: {
index += 4;
continue;
}
case 0x34: {
index += 0x80;
continue;
}
case 0x40:
num6 = Utils.Read4BytesAsInt32(polydata, index);
index += 4;
num = num6;
switch (num6) {
case 0:
goto Label_0E92;
case 1:
goto Label_0E97;
case 2:
goto Label_0E9C;
case 3:
goto Label_0EA1;
}
throw new Exception();
case 0x41:
switch (num) {
case 0:
goto Label_0ED1;
case 1:
goto Label_0EF6;
case 2:
goto Label_0F1B;
case 3:
goto Label_0F40;
}
goto Label_0F67;
default: {
continue;
}
}
Label_0358:
num10 = 0;
while (num10 < 3) {
CurrentMatrix[num10, num9] = ((float)Utils.Read4BytesAsInt32(polydata, index)) / 4096f;
index += 4;
num9++;
}
num9++;
Label_039C:
if (num9 < 4) {
goto Label_0358;
}
continue;
Label_03C1:
mtx[num9] = ((float)Utils.Read4BytesAsInt32(polydata, index)) / 4096f;
index += 4;
num9++;
Label_03E8:
if (num9 < 0x10) {
goto Label_03C1;
}
CurrentMatrix.MultMatrix(mtx).CopyValuesTo(CurrentMatrix);
continue;
Label_0425:
num10 = 0;
while (num10 < 3) {
mtx[num10, num9] = ((float)Utils.Read4BytesAsInt32(polydata, index)) / 4096f;
index += 4;
num9++;
}
num9++;
Label_0466:
if (num9 < 4) {
goto Label_0425;
}
CurrentMatrix.MultMatrix(mtx).CopyValuesTo(CurrentMatrix);
continue;
Label_04A2:
num10 = 0;
while (num10 < 3) {
mtx[num10, num9] = ((float)Utils.Read4BytesAsInt32(polydata, index)) / 4096f;
index += 4;
num9++;
}
num9++;
Label_04E3:
if (num9 < 3) {
goto Label_04A2;
}
CurrentMatrix.MultMatrix(mtx).CopyValuesTo(CurrentMatrix);
continue;
Label_08E2:
list.Add(new Vector3(v[0], v[1], v[2]));
list2.Add(item);
list3.Add(vector2);
Label_090F:
if (this.writevertex) {
}
continue;
Label_09E1:
list.Add(new Vector3(v[0], v[1], v[2]));
list2.Add(item);
list3.Add(vector2);
Label_0A0E:
if (this.writevertex) {
}
continue;
Label_0ABF:
list.Add(new Vector3(v[0], v[1], v[2]));
list2.Add(item);
list3.Add(vector2);
Label_0AEC:
if (this.writevertex) {
}
continue;
Label_0B9D:
list.Add(new Vector3(v[0], v[1], v[2]));
list2.Add(item);
list3.Add(vector2);
Label_0BCA:
if (this.writevertex) {
}
continue;
Label_0C7B:
list.Add(new Vector3(v[0], v[1], v[2]));
list2.Add(item);
list3.Add(vector2);
Label_0CA8:
if (this.writevertex) {
}
continue;
Label_0DAA:
list.Add(new Vector3(v[0], v[1], v[2]));
list2.Add(item);
list3.Add(vector2);
Label_0DD7:
if (this.writevertex) {
}
continue;
Label_0E92:
num6 = 4;
continue;
Label_0E97:
num6 = 7;
continue;
Label_0E9C:
num6 = 5;
continue;
Label_0EA1:
num6 = 8;
continue;
Label_0ED1:
group.Add(new MKDS_Course_Editor.Export3DTools.Polygon(PolygonType.Triangle, list2.ToArray(), list3.ToArray(), list.ToArray()));
goto Label_0F67;
Label_0EF6:
group.Add(new MKDS_Course_Editor.Export3DTools.Polygon(PolygonType.Quad, list2.ToArray(), list3.ToArray(), list.ToArray()));
goto Label_0F67;
Label_0F1B:
group.Add(new MKDS_Course_Editor.Export3DTools.Polygon(PolygonType.TriangleStrip, list2.ToArray(), list3.ToArray(), list.ToArray()));
goto Label_0F67;
Label_0F40:
group.Add(new MKDS_Course_Editor.Export3DTools.Polygon(PolygonType.QuadStrip, list2.ToArray(), list3.ToArray(), list.ToArray()));
Label_0F67:
list2.Clear();
list.Clear();
list3.Clear();
gCurrentVertex--;
if ((gCurrentVertex < 0) && gOptVertexMode) {
return group;
}
}
}
}
return group;
}
#endregion Methods
/*------------------------------------------------------------
combine texture + palette data obtained from NSBMD / NSBTX files
This functions convert all textures of a model into 32-bit bitmap for OpenGL use
A model has a number of "materials"; Material means a pair of texture and palette.
------------------------------------------------------------*/
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDLoader.cs
================================================
// Loader for NSBMD files.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System.IO;
namespace LibNDSFormats.NSBMD
{
///
/// Loader for NSBMD data.
///
public static class NSBMDLoader
{
///
/// Load NSBMD from stream.
///
/// Stream with NSBMD data.
/// NSBMD object.
public static NSBMD LoadNSBMD(Stream stream)
{
return NSBMD.FromStream(stream);
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDMaterial.cs
================================================
// Material type for NSBMD models.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
using System.Drawing;
using System.Collections.Generic;
namespace LibNDSFormats.NSBMD
{
public class NSBMDMaterial
{
#region Fields (16)
public int color0;
public int format;
public int height;
public RGBA[] paldata;
public uint palmatid;
public string palname = String.Empty;
public UInt32 paloffset;
public UInt32 palsize;
public byte repeat;
public byte[] spdata;
public byte[] texdata;
public List texmatid = new List();
public bool isEnvironmentMap = false;
public string texname = String.Empty;
public UInt32 texoffset;
public UInt32 texsize;
public int width;
public string MaterialName;
public int repeatS;
public int repeatT;
public int flipS;
public int flipT;
public float rot;
public float scaleT;
public float scaleS;
public float transT;
public float transS;
public Color DiffuseColor;
public Color AmbientColor;
public Color SpecularColor;
public Color EmissionColor;
public uint PolyAttrib;
public int Alpha;
public bool diffuseColor;
public bool shine;
public float[] mtx = null;
#endregion Fields
#region Methods (1)
// Public Methods (1)
///
/// Copy data to other NSBMD material
///
/// Other NSBMD material.
public NSBMDMaterial CopyTo(NSBMDMaterial other1)
{
NSBMDMaterial other = other1;
other.texname = texname;
other.texoffset = texoffset;
other.texsize = texsize;
other.format = format;
other.color0 = color0;
other.width = width;
other.height = height;
other.texdata = texdata;
other.spdata = spdata;
other.MaterialName = MaterialName;
return other;
}
#endregion Methods
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDModel.cs
================================================
// Model definition for NSBMD.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System.Collections.Generic;
namespace LibNDSFormats.NSBMD
{
///
/// NSBMD model type.
///
public class NSBMDModel
{
#region Fields (3)
///
/// NSBMD materials.
///
public readonly List Materials = new List();
///
/// NSBMD materials.
///
public readonly List Textures = new List();
///
/// NSBMD materials.
///
public readonly List Palettes = new List();
///
/// NSBMD objects.
///
public readonly List Objects = new List();
///
/// NSBMD polygons.
///
public readonly List Polygons = new List();
#endregion Fields
#region Properties (1)
///
/// Model name.
///
public string Name { get; set; }
public List tex_mat = new List();
public List pal_mat = new List();
public float boundXmin;
public float boundYmin;
public float boundZmin;
public float boundXmax;
public float boundYmax;
public float boundZmax;
public float boundScale;
public float modelScale;
public int laststackid;
#endregion Properties
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDObject.cs
================================================
// Object definiton for NSBMD models.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
using System.Collections.Generic;
namespace LibNDSFormats.NSBMD
{
///
/// Type for NSBMD objects.
///
public class NSBMDObject
{
#region Fields (7)
private readonly float[] _transVect = new float[3];
private float _x;
private float _y;
private float _z;
private const float FACTOR1 = 1f;
// StackID used by this object
public int RestoreID = -1;
// rotation
public int StackID = -1;
public bool visible = true;
public List childs = new List();
public float[] rotate_mtx = NSBMDGlRenderer.loadIdentity();
public float[] scale = new float[3];
public float[] materix = NSBMDGlRenderer.loadIdentity();
public bool isBillboard = false;
public bool isYBillboard = false;
#endregion Fields
#region Properties (12)
public bool IsRotated { get; set; }
public bool IsRotated2 { get; set; }
public bool IsScaled { get; set; }
// this object's ParentID object ID
public String Name { get; set; }
public int Neg { get; set; }
// RestoreID is the ID of the matrix in stack{ get; set; } to be restored as current matrix
public int ParentID { get; set; }
public int Pivot { get; set; }
// applies to rotation matrix
public float RotA { get; set; }
// rotation
public float RotB { get; set; }
// Name of this object
public bool Trans { get; set; }
public float[] TransVect
{
get { return _transVect; }
}
public float X
{
get { return _x; }
set
{
_x = value;
TransVect[0] = value/FACTOR1;
}
}
public float Y
{
get { return _y; }
set
{
_y = value;
TransVect[1] = value/FACTOR1;
}
}
public float Z
{
get { return _z; }
set
{
_z = value;
TransVect[2] = value/FACTOR1;
}
}
#endregion Properties
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDPalette.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LibNDSFormats.NSBMD
{
public class NSBMDPalette
{
public int color0;
public RGBA[] paldata;
public List palmatid = new List();
public string palname = String.Empty;
public UInt32 paloffset;
public UInt32 palsize;
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDPolygon.cs
================================================
// Polygon definition for NSBMD models.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
namespace LibNDSFormats.NSBMD
{
///
/// Type for NSBMd polygons.
///
public class NSBMDPolygon
{
#region Properties (4)
///
/// Used material ID.
///
public int MatId { get; set; }
///
/// Name of polygon.
///
public string Name { get; set; }
///
/// Polygon data.
///
public byte[] PolyData { get; set; }
//public UInt32 DataOffset{ get; set; }
//public int DataSize{ get; set; }
///
/// StackID of polygon.
///
public int StackID { get; set; }
public int JointID { get; set; }
#endregion Properties
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBMD/NSBMDTexture.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LibNDSFormats.NSBMD
{
public class NSBMDTexture
{
public int format;
public int height;
public byte repeat;
public byte[] spdata;
public byte[] texdata;
public List texmatid = new List();
public string texname = String.Empty;
public UInt32 texoffset;
public UInt32 texsize;
public int width;
public int color0;
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBTA.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
namespace MKDS_Course_Editor.NSBTA {
public class NSBTA {
public struct NSBTA_File {
public header Header;
public struct header {
public string ID;
public byte[] Magic;
public Int32 file_size;
public Int16 header_size;
public Int16 nSection;
public Int32[] Section_Offset;
}
public srt0 SRT0;
public struct srt0 //Scale Rotation and Translation
{
public string ID;
public Int32 Size;
//3D Info Structure
public byte dummy;
public byte num_objs;
public short section_size;
public UnknownBlock unknownBlock;
public Info infoBlock;
public string[] names;
public struct UnknownBlock {
public short header_size;
public short section_size;
public int constant; // 0x017F
public short[] unknown1;
public short[] unknown2;
}
public struct Info {
public short header_size;
public short data_size;
public info[] Data;
public struct info {
public Int32 MAToffset;
}
}
}
public M_AT MAT;
public struct M_AT {
public string ID;
public Int16 Unknown1;
public byte Unknown2;
public byte Unknown3;
//3D Info Structure
public byte dummy;
public byte num_objs;
public short section_size;
public UnknownBlock unknownBlock;
public Info infoBlock;
public string[] names;
public struct UnknownBlock {
public short header_size;
public short section_size;
public int constant; // 0x017F
public short[] unknown1;
public short[] unknown2;
}
public struct Info {
public short header_size;
public short data_size;
public info[] Data;
public struct info {
public Int16[] frame;
public Int16[] var1;
public Int16[] var2;
public Int16[] var3;
public int[] frameStep;
}
}
}
public srtData[] SRTData;
public struct srtData {
public decimal[] scaleS;
public decimal[] scaleT;
public decimal[] rotate;
public decimal[] translateS;
public decimal[] translateT;
}
}
public static NSBTA_File Read(string Filename) {
EndianBinaryReader er = new EndianBinaryReader(File.OpenRead(Filename), Endianness.LittleEndian);
NSBTA_File ns = new NSBTA_File();
ns.Header.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.Header.ID == "BTA0") {
ns.Header.Magic = er.ReadBytes(4);
ns.Header.file_size = er.ReadInt32();
ns.Header.header_size = er.ReadInt16();
ns.Header.nSection = er.ReadInt16();
ns.Header.Section_Offset = new Int32[ns.Header.nSection];
for (int i = 0; i < ns.Header.nSection; i++) {
ns.Header.Section_Offset[i] = er.ReadInt32();
}
ns.SRT0.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.SRT0.ID == "SRT0") {
ns.SRT0.Size = er.ReadInt32();
//3D Info Structure
ns.SRT0.dummy = er.ReadByte();
ns.SRT0.num_objs = er.ReadByte();
ns.SRT0.section_size = er.ReadInt16();
ns.SRT0.unknownBlock.header_size = er.ReadInt16();
ns.SRT0.unknownBlock.section_size = er.ReadInt16();
ns.SRT0.unknownBlock.constant = er.ReadInt32();
ns.SRT0.unknownBlock.unknown1 = new short[ns.SRT0.num_objs];
ns.SRT0.unknownBlock.unknown2 = new short[ns.SRT0.num_objs];
for (int i = 0; i < ns.SRT0.num_objs; i++) {
ns.SRT0.unknownBlock.unknown1[i] = er.ReadInt16();
ns.SRT0.unknownBlock.unknown2[i] = er.ReadInt16();
}
ns.SRT0.infoBlock.header_size = er.ReadInt16();
ns.SRT0.infoBlock.data_size = er.ReadInt16();
ns.SRT0.infoBlock.Data = new NSBTA_File.srt0.Info.info[ns.SRT0.num_objs];
for (int i = 0; i < ns.SRT0.num_objs; i++) {
ns.SRT0.infoBlock.Data[i].MAToffset = er.ReadInt32();
}
ns.SRT0.names = new string[ns.SRT0.num_objs];
for (int i = 0; i < ns.SRT0.num_objs; i++) {
ns.SRT0.names[i] = er.ReadString(Encoding.ASCII, 16).Replace("\0", "");
}
ns.MAT.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.MAT.ID == "M" + (char)0x00 + "AT") {
ns.MAT.Unknown1 = er.ReadInt16();
ns.MAT.Unknown2 = er.ReadByte();
ns.MAT.Unknown3 = er.ReadByte();
//3D Info Structure
ns.MAT.dummy = er.ReadByte();
ns.MAT.num_objs = er.ReadByte();
ns.MAT.section_size = er.ReadInt16();
ns.MAT.unknownBlock.header_size = er.ReadInt16();
ns.MAT.unknownBlock.section_size = er.ReadInt16();
ns.MAT.unknownBlock.constant = er.ReadInt32();
ns.MAT.unknownBlock.unknown1 = new short[ns.MAT.num_objs];
ns.MAT.unknownBlock.unknown2 = new short[ns.MAT.num_objs];
for (int i = 0; i < ns.MAT.num_objs; i++) {
ns.MAT.unknownBlock.unknown1[i] = er.ReadInt16();
ns.MAT.unknownBlock.unknown2[i] = er.ReadInt16();
}
ns.MAT.infoBlock.header_size = er.ReadInt16();
ns.MAT.infoBlock.data_size = er.ReadInt16();
ns.MAT.infoBlock.Data = new NSBTA_File.M_AT.Info.info[ns.MAT.num_objs];
ns.SRTData = new NSBTA_File.srtData[ns.MAT.num_objs];
for (int i = 0; i < ns.MAT.num_objs; i++) {
ns.MAT.infoBlock.Data[i].frame = new short[5];
ns.MAT.infoBlock.Data[i].var1 = new short[5];
ns.MAT.infoBlock.Data[i].var2 = new short[5];
ns.MAT.infoBlock.Data[i].var3 = new short[5];
ns.MAT.infoBlock.Data[i].frameStep = new int[5];
for (int j = 0; j < 5; j++) {
ns.MAT.infoBlock.Data[i].frame[j] = er.ReadInt16();
ns.MAT.infoBlock.Data[i].var1[j] = (short)(er.ReadInt16() / 4096);
ns.MAT.infoBlock.Data[i].var2[j] = er.ReadInt16();
ns.MAT.infoBlock.Data[i].var3[j] = (short)(er.ReadInt16() / 4096);
}
if (ns.MAT.infoBlock.Data[i].var1[0] > 1) {
ns.SRTData[i].scaleS = new decimal[1];
ns.SRTData[i].scaleS[0] = Math.Abs(ns.MAT.infoBlock.Data[i].var2[0] / 4096);
} else {
ns.SRTData[i].scaleS = new decimal[ns.MAT.infoBlock.Data[i].frame[0]];
}
if (ns.MAT.infoBlock.Data[i].var1[1] > 1) {
ns.SRTData[i].scaleT = new decimal[1];
ns.SRTData[i].scaleT[0] = Math.Abs(ns.MAT.infoBlock.Data[i].var2[1] / 4096);
} else {
ns.SRTData[i].scaleT = new decimal[ns.MAT.infoBlock.Data[i].frame[1]];
}
if (ns.MAT.infoBlock.Data[i].var1[2] > 1) {
ns.SRTData[i].rotate = new decimal[2];
ns.SRTData[i].rotate[0] = ns.MAT.infoBlock.Data[i].var2[2];
ns.SRTData[i].rotate[1] = ns.MAT.infoBlock.Data[i].var3[2];
} else {
ns.SRTData[i].rotate = new decimal[ns.MAT.infoBlock.Data[i].frame[2] * 2];
}
if (ns.MAT.infoBlock.Data[i].var1[3] > 1) {
ns.SRTData[i].translateS = new decimal[1];
ns.SRTData[i].translateS[0] = Math.Abs(ns.MAT.infoBlock.Data[i].var2[3] / 4096);
} else {
ns.SRTData[i].translateS = new decimal[ns.MAT.infoBlock.Data[i].frame[3]];
ns.MAT.infoBlock.Data[i].frameStep[3] = Math.Abs(ns.MAT.infoBlock.Data[i].var1[3] >> 1);
}
if (ns.MAT.infoBlock.Data[i].var1[4] > 1) {
ns.SRTData[i].translateT = new decimal[1];
ns.SRTData[i].translateT[0] = Math.Abs(ns.MAT.infoBlock.Data[i].var2[4] / 4096);
} else {
ns.SRTData[i].translateT = new decimal[ns.MAT.infoBlock.Data[i].frame[4]];
ns.MAT.infoBlock.Data[i].frameStep[4] = Math.Abs(ns.MAT.infoBlock.Data[i].var1[4] >> 1);
}
//ns.SRTData[i].scaleS = new decimal[ns.MAT.infoBlock.Data[i].var1[0] == 3 ? 1 : ns.MAT.infoBlock.Data[i].frame[0]];
//ns.SRTData[i].scaleT = new decimal[ns.MAT.infoBlock.Data[i].var1[1] == 3 ? 1 : ns.MAT.infoBlock.Data[i].frame[1]];
//ns.SRTData[i].rotate = new decimal[ns.MAT.infoBlock.Data[i].var1[2] == 2 ? ns.MAT.infoBlock.Data[i].var1[2] == 3 ? 2 : 1 : ns.MAT.infoBlock.Data[i].frame[2]];
//ns.SRTData[i].translateS = new decimal[ns.MAT.infoBlock.Data[i].var1[3] == 3 ? 1 : ns.MAT.infoBlock.Data[i].frame[3]];
//ns.SRTData[i].translateT = new decimal[ns.MAT.infoBlock.Data[i].var1[4] == 3 ? 1 : ns.MAT.infoBlock.Data[i].frame[4]];
}
ns.MAT.names = new string[ns.MAT.num_objs];
for (int i = 0; i < ns.MAT.num_objs; i++) {
ns.MAT.names[i] = er.ReadString(Encoding.ASCII, 16).Replace("\0", "");
}
for (int i = 0; i < ns.MAT.num_objs; i++) {
if (ns.SRTData[i].scaleS.Length != 1) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.SRT0.section_size + ns.MAT.infoBlock.Data[i].var2[0] + 8;
for (int j = 0; j < ns.SRTData[i].scaleS.Length; j++) {
ns.SRTData[i].scaleS[j] = (decimal)(er.ReadInt16() / 4096d);
}
}
if (ns.SRTData[i].scaleT.Length != 1) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.SRT0.section_size + ns.MAT.infoBlock.Data[i].var2[1] + 8;
for (int j = 0; j < ns.SRTData[i].scaleT.Length; j++) {
ns.SRTData[i].scaleT[j] = (decimal)(er.ReadInt16() / 4096d);
}
}
if (ns.SRTData[i].rotate.Length != 2) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.SRT0.section_size + ns.MAT.infoBlock.Data[i].var2[2] + 8;
for (int j = 0; j < ns.SRTData[i].rotate.Length; j++) {
ns.SRTData[i].rotate[j] = (decimal)(er.ReadInt16() / 4096d);
}
}
if (ns.SRTData[i].translateS.Length != 1) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.SRT0.section_size + ns.MAT.infoBlock.Data[i].var2[3] + 8;
for (int j = 0; j < ns.SRTData[i].translateS.Length; j += (ns.MAT.infoBlock.Data[i].frameStep[3] == 0 ? 1 : ns.MAT.infoBlock.Data[i].frameStep[3])) {
decimal value = (decimal)(er.ReadInt16() / 4096d);
for (int k = 0; k < (ns.MAT.infoBlock.Data[i].frameStep[3] == 0 ? 1 : ns.MAT.infoBlock.Data[i].frameStep[3]); k++) {
ns.SRTData[i].translateS[j + k] = value;
}
}
}
if (ns.SRTData[i].translateT.Length != 1) {
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.SRT0.section_size + ns.MAT.infoBlock.Data[i].var2[4] + 8;
for (int j = 0; j < ns.SRTData[i].translateT.Length; j += (ns.MAT.infoBlock.Data[i].frameStep[4] == 0 ? 1 : ns.MAT.infoBlock.Data[i].frameStep[4])) {
decimal value = (decimal)(er.ReadInt16() / 4096d);
for (int k = 0; k < (ns.MAT.infoBlock.Data[i].frameStep[4] == 0 ? 1 : ns.MAT.infoBlock.Data[i].frameStep[4]); k++) {
ns.SRTData[i].translateT[j + k] = value;
}
}
}
}
} else {
MessageBox.Show("Error");
er.Close();
return ns;
}
} else {
MessageBox.Show("Error");
er.Close();
return ns;
}
} else {
MessageBox.Show("Error");
er.Close();
return ns;
}
er.Close();
return ns;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBTP.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace MKDS_Course_Editor.NSBTP {
public class NSBTP {
public struct NSBTP_File {
public header Header;
public struct header {
public string ID;
public byte[] Magic;
public Int32 file_size;
public Int16 header_size;
public Int16 nSection;
public Int32[] Section_Offset;
}
public pat0 PAT0;
public struct pat0 //Scale Rotation and Translation
{
public string ID;
public Int32 Size;
//3D Info Structure
public byte dummy;
public byte num_objs;
public short section_size;
public UnknownBlock unknownBlock;
public Info infoBlock;
public string[] names;
public struct UnknownBlock {
public short header_size;
public short section_size;
public int constant; // 0x017F
public short[] unknown1;
public short[] unknown2;
}
public struct Info {
public short header_size;
public short data_size;
public info[] Data;
public struct info {
public Int32 MPToffset;
}
}
}
public M_PT MPT;
public struct M_PT {
public string ID;
public Int16 NoFrames;
public byte NoTex;
public byte NoPal;
public Int16 Texoffset;
public Int16 Paloffset;
//3D Info Structure
public byte dummy;
public byte num_objs;
public short section_size;
public UnknownBlock unknownBlock;
public Info infoBlock;
public string[] names;
public struct UnknownBlock {
public short header_size;
public short section_size;
public int constant; // 0x017F
public short[] unknown1;
public short[] unknown2;
}
public struct Info {
public short header_size;
public short data_size;
public info[] Data;
public struct info {
public Int32 KeyFrames;
public short Unknown1;
public short Offset;
}
}
}
public animData[] AnimData;
public struct animData {
public keyFrame[] KeyFrames;
public struct keyFrame {
public short Start;
public byte texId;
public byte palId;
public string texName;
public string palName;
}
}
}
public static NSBTP_File Read(string Filename) {
EndianBinaryReader er = new EndianBinaryReader(File.OpenRead(Filename), Endianness.LittleEndian);
NSBTP_File ns = new NSBTP_File();
ns.Header.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.Header.ID == "BTP0") {
ns.Header.Magic = er.ReadBytes(4);
ns.Header.file_size = er.ReadInt32();
ns.Header.header_size = er.ReadInt16();
ns.Header.nSection = er.ReadInt16();
ns.Header.Section_Offset = new Int32[ns.Header.nSection];
for (int i = 0; i < ns.Header.nSection; i++) {
ns.Header.Section_Offset[i] = er.ReadInt32();
}
ns.PAT0.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.PAT0.ID == "PAT0") {
ns.PAT0.Size = er.ReadInt32();
//3D Info Structure
ns.PAT0.dummy = er.ReadByte();
ns.PAT0.num_objs = er.ReadByte();
ns.PAT0.section_size = er.ReadInt16();
ns.PAT0.unknownBlock.header_size = er.ReadInt16();
ns.PAT0.unknownBlock.section_size = er.ReadInt16();
ns.PAT0.unknownBlock.constant = er.ReadInt32();
ns.PAT0.unknownBlock.unknown1 = new short[ns.PAT0.num_objs];
ns.PAT0.unknownBlock.unknown2 = new short[ns.PAT0.num_objs];
for (int i = 0; i < ns.PAT0.num_objs; i++) {
ns.PAT0.unknownBlock.unknown1[i] = er.ReadInt16();
ns.PAT0.unknownBlock.unknown2[i] = er.ReadInt16();
}
ns.PAT0.infoBlock.header_size = er.ReadInt16();
ns.PAT0.infoBlock.data_size = er.ReadInt16();
ns.PAT0.infoBlock.Data = new NSBTP_File.pat0.Info.info[ns.PAT0.num_objs];
for (int i = 0; i < ns.PAT0.num_objs; i++) {
ns.PAT0.infoBlock.Data[i].MPToffset = er.ReadInt32();
}
ns.PAT0.names = new string[ns.PAT0.num_objs];
for (int i = 0; i < ns.PAT0.num_objs; i++) {
ns.PAT0.names[i] = er.ReadString(Encoding.ASCII, 16).Replace("\0", "");
}
ns.MPT.ID = er.ReadString(Encoding.ASCII, 4);
if (ns.MPT.ID == "M" + (char)0x00 + "PT") {
ns.MPT.NoFrames = er.ReadInt16();
ns.MPT.NoTex = er.ReadByte();
ns.MPT.NoPal = er.ReadByte();
ns.MPT.Texoffset = er.ReadInt16();
ns.MPT.Paloffset = er.ReadInt16();
//3D Info Structure
ns.MPT.dummy = er.ReadByte();
ns.MPT.num_objs = er.ReadByte();
ns.MPT.section_size = er.ReadInt16();
ns.MPT.unknownBlock.header_size = er.ReadInt16();
ns.MPT.unknownBlock.section_size = er.ReadInt16();
ns.MPT.unknownBlock.constant = er.ReadInt32();
ns.MPT.unknownBlock.unknown1 = new short[ns.MPT.num_objs];
ns.MPT.unknownBlock.unknown2 = new short[ns.MPT.num_objs];
for (int i = 0; i < ns.MPT.num_objs; i++) {
ns.MPT.unknownBlock.unknown1[i] = er.ReadInt16();
ns.MPT.unknownBlock.unknown2[i] = er.ReadInt16();
}
ns.MPT.infoBlock.header_size = er.ReadInt16();
ns.MPT.infoBlock.data_size = er.ReadInt16();
ns.MPT.infoBlock.Data = new NSBTP_File.M_PT.Info.info[ns.MPT.num_objs];
ns.AnimData = new NSBTP_File.animData[ns.MPT.num_objs];
for (int i = 0; i < ns.MPT.num_objs; i++) {
ns.MPT.infoBlock.Data[i].KeyFrames = er.ReadInt32();
ns.MPT.infoBlock.Data[i].Unknown1 = er.ReadInt16();
ns.MPT.infoBlock.Data[i].Offset = er.ReadInt16();
ns.AnimData[i].KeyFrames = new NSBTP_File.animData.keyFrame[ns.MPT.infoBlock.Data[i].KeyFrames];
for (int j = 0; j < ns.MPT.infoBlock.Data[i].KeyFrames; j++) {
long curpos = er.BaseStream.Position;
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.PAT0.section_size + ns.MPT.infoBlock.Data[i].Offset + j * 4 + 8;
ns.AnimData[i].KeyFrames[j].Start = er.ReadInt16();
ns.AnimData[i].KeyFrames[j].texId = er.ReadByte();
ns.AnimData[i].KeyFrames[j].palId = er.ReadByte();
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.PAT0.section_size + ns.MPT.Texoffset + ns.AnimData[i].KeyFrames[j].texId * 16 + 8;
ns.AnimData[i].KeyFrames[j].texName = LibNDSFormats.Utils.ReadNSBMDString(er);
er.BaseStream.Position = ns.Header.Section_Offset[0] + ns.PAT0.section_size + ns.MPT.Paloffset + ns.AnimData[i].KeyFrames[j].palId * 16 + 8;
ns.AnimData[i].KeyFrames[j].palName = LibNDSFormats.Utils.ReadNSBMDString(er);
er.BaseStream.Position = curpos;
}
}
ns.MPT.names = new string[ns.MPT.num_objs];
for (int i = 0; i < ns.MPT.num_objs; i++) {
ns.MPT.names[i] = LibNDSFormats.Utils.ReadNSBMDString(er);
}
} else {
MessageBox.Show("NSBTP Error");
er.Close();
return ns;
}
} else {
MessageBox.Show("NSBTP Error");
er.Close();
return ns;
}
} else {
MessageBox.Show("NSBTP Error");
er.Close();
return ns;
}
er.Close();
return ns;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBTX/File.cs
================================================
/*
* This file is part of NSMB Editor 5.
*
* NSMB Editor 5 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NSMB Editor 5 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NSMB Editor 5. If not, see .
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace NSMBe4.DSFileSystem
{
public class File : IComparable
{
public bool isSystemFile;
byte[] file2;
protected string nameP;
public string name { get { return nameP; } }
protected int idP;
public int id { get { return idP; } }
protected Directory parentDirP;
public Directory parentDir { get { return parentDirP; } }
//if allocationFile is not null,
//these are the offsets within the alloc file where the offsets
//of this file are found.
protected File beginFile;
protected int beginOffset;
protected File endFile;
protected int endOffset;
protected bool endIsSize; //means that the end offset is the size of the file
protected bool fixedFile; //means that the file cant be moved nor changed size
public int fileBegin;
public int fileSize;
public int alignment = 4; // word align by default
public bool canChangeOffset = true; //false for arm9 and 7 bins
public Filesystem parent;
protected Object editedBy = null;
public Boolean beingEdited
{
get { return editedBy != null; }
}
public File(Filesystem parent, Directory parentDir, string name)
{
this.parent = parent;
this.parentDirP = parentDir;
this.nameP = name;
this.fileBegin = 0;
this.fileSize = (int)parent.s.Length;
this.isSystemFile = true;
}
public File(Filesystem parent, Directory parentDir, bool systemFile, int id, string name, File alFile, int alBeg, int alEnd)
{
this.parent = parent;
this.parentDirP = parentDir;
this.isSystemFile = systemFile;
this.idP = id;
this.nameP = name;
this.beginFile = alFile;
this.endFile = alFile;
this.beginOffset = alBeg;
this.endOffset = alEnd;
refreshOffsets();
}
public File(Filesystem parent, Directory parentDir, bool systemFile, int id, string name, File alFile, int alBeg, int alEnd, bool endsize)
{
this.parent = parent;
this.parentDirP = parentDir;
this.isSystemFile = systemFile;
this.idP = id;
this.nameP = name;
this.beginFile = alFile;
this.endFile = alFile;
this.beginOffset = alBeg;
this.endOffset = alEnd;
this.endIsSize = endsize;
refreshOffsets();
}
public File(Filesystem parent, Directory parentDir, bool systemFile, int id, string name, int alBeg, int alSize)
{
this.parent = parent;
this.parentDirP = parentDir;
this.isSystemFile = systemFile;
this.idP = id;
this.nameP = name;
this.fileBegin = alBeg;
this.fileSize = alSize;
refreshOffsets();
}
public virtual byte[] getContents()
{
// enableEdition();
byte[] file = new byte[fileSize];
parent.s.Seek(fileBegin, SeekOrigin.Begin);
parent.s.Read(file, 0, file.Length);
return file;
}
public void dumpFile(int ind)
{
for (int i = 0; i < ind; i++)
Console.Out.Write(" ");
Console.Out.WriteLine("[" + id + "] " + name + ", at " + fileBegin.ToString("X") + ", size: " + fileSize);
}
public virtual void refreshOffsets()
{
if (beginFile != null)
fileBegin = (int)beginFile.getUintAt(beginOffset) + parent.fileDataOffset;
if (endFile != null)
{
int end = (int)endFile.getUintAt(endOffset);
if (endIsSize)
fileSize = (int)end;
else
fileSize = (int)end + parent.fileDataOffset - fileBegin;
}
}
public virtual void saveOffsets()
{
if (beginFile != null)
beginFile.setUintAt(beginOffset, (uint)(fileBegin - parent.fileDataOffset));
if (endFile != null)
if (endIsSize)
endFile.setUintAt(endOffset, (uint)fileSize);
else
endFile.setUintAt(endOffset, (uint)(fileBegin + fileSize - parent.fileDataOffset));
}
public uint getUintAt(int offset)
{
enableEdition();
long pos = parent.s.Position;
parent.s.Seek(fileBegin + offset, SeekOrigin.Begin);
uint res = 0;
for (int i = 0; i < 4; i++)
{
res |= (uint)parent.s.ReadByte() << 8 * i;
}
parent.s.Seek(pos, SeekOrigin.Begin);
return res;
}
public void setUintAt(int offset, uint val)
{
enableEdition();
long pos = parent.s.Position;
parent.s.Seek(fileBegin + offset, SeekOrigin.Begin);
for (int i = 0; i < 4; i++)
{
parent.s.WriteByte((byte)(val & 0xFF));
val >>= 8;
}
parent.s.Seek(pos, SeekOrigin.Begin);
}
public ushort getUshortAt(int offset)
{
enableEdition();
long pos = parent.s.Position;
parent.s.Seek(fileBegin + offset, SeekOrigin.Begin);
ushort res = 0;
for (int i = 0; i < 2; i++)
{
res |= (ushort)(parent.s.ReadByte() << 8 * i);
}
parent.s.Seek(pos, SeekOrigin.Begin);
return res;
}
public void setUshortAt(int offset, ushort val)
{
enableEdition();
long pos = parent.s.Position;
parent.s.Seek(fileBegin + offset, SeekOrigin.Begin);
for (int i = 0; i < 2; i++)
{
parent.s.WriteByte((byte)(val & 0xFF));
val >>= 8;
}
parent.s.Seek(pos, SeekOrigin.Begin);
}
public byte getByteAt(int offs)
{
enableEdition();
long pos = parent.s.Position;
parent.s.Seek(fileBegin + offs, SeekOrigin.Begin);
byte res = (byte)parent.s.ReadByte();
parent.s.Seek(pos, SeekOrigin.Begin);
return res;
}
public void setByteAt(int offs, byte val)
{
enableEdition();
long pos = parent.s.Position;
parent.s.Seek(fileBegin + offs, SeekOrigin.Begin);
parent.s.WriteByte(val);
parent.s.Seek(pos, SeekOrigin.Begin);
}
public bool isAGoodEditor(object editor)
{
if (!beingEdited)
return false;
if (editor == editedBy)
return true;
if (editor is InlineFile && inlineEditors.Contains(editor as InlineFile))
return true;
return false;
}
public virtual void replace(byte[] newFile, object editor)
{
//if (!isAGoodEditor(editor))
// throw new Exception("NOT CORRECT EDITOR " + name);
if (newFile.Length != fileSize && fixedFile)
throw new Exception("TRYING TO RESIZE FIXED FILE: " + name);
// enableEdition();
// Console.Out.WriteLine("Replacing: [" + id + "] " + name);
int newStart = fileBegin;
if (newFile.Length > fileSize) //if we insert a bigger file
{ //it might not fit in the current place
if (canChangeOffset)
{
newStart = parent.findFreeSpace(newFile.Length, alignment);
if (newStart % alignment != 0)
newStart += alignment - newStart % alignment;
}
else
{
parent.allFiles.Sort();
if (!(parent.allFiles.IndexOf(this) == parent.allFiles.Count - 1))
{
File nextFile = parent.allFiles[parent.allFiles.IndexOf(this) + 1];
parent.moveAllFiles(nextFile, fileBegin + newFile.Length);
}
}
}
/*else if (parent is NarcFilesystem)
{
parent.allFiles.Sort();
if (!(parent.allFiles.IndexOf(this) == parent.allFiles.Count - 1))
{
File nextFile = parent.allFiles[parent.allFiles.IndexOf(this) + 1];
parent.moveAllFiles(nextFile, fileBegin + newFile.Length);
}
}*/
if (newStart % alignment != 0)
Console.Out.Write("Warning: File is not being aligned: " + nameP + ", at " + newStart.ToString("X"));
//write the file
parent.s.Seek(newStart, SeekOrigin.Begin);
parent.s.Write(newFile, 0, newFile.Length);
//if (parent is NarcFilesystem)
// parent.s.SetLength(parent.allFiles[parent.allFiles.Count - 1].fileBegin + parent.allFiles[parent.allFiles.Count - 1].fileSize + 10);
//update ending pos
fileBegin = newStart;
fileSize = newFile.Length;
saveOffsets();
parent.fileMoved(this); //NEEDED FOR UPDATING TOTAL USED ROM SIZE IN HEADER
}
public void moveTo(int newOffs)
{
if (newOffs % alignment != 0)
Console.Out.Write("Warning: File is not being aligned: " + nameP + ", at " + newOffs.ToString("X"));
byte[] data = getContents();
parent.s.Seek(newOffs, SeekOrigin.Begin);
parent.s.Write(data, 0, data.Length);
fileBegin = newOffs;
saveOffsets();
}
public int CompareTo(object obj)
{
File f = obj as File;
if (fileBegin == f.fileBegin)
return fileSize.CompareTo(f.fileSize);
return fileBegin.CompareTo(f.fileBegin);
}
public virtual void beginEdit(Object editor)
{
if (beingEdited)
throw new Exception();
else
editedBy = editor;
}
public virtual void endEdit(Object editor)
{
//if (!beingEdited)
// throw new Exception("NOT EDITING FILE " + name);
//if (editor != editedBy)
// throw new Exception("NOT CORRECT EDITOR" + name);
editedBy = null;
}
public bool beingEditedBy(Object ed)
{
return ed == editedBy;
}
public bool isAddrInFile(int addr)
{
return addr >= fileBegin && addr < fileBegin + fileSize;
}
private List inlineEditors = new List();
public void beginEditInline(InlineFile f)
{
if (inlineEditors.Count == 0)
beginEdit(this);
inlineEditors.Add(f);
}
public void endEditInline(InlineFile f)
{
if (!inlineEditors.Contains(f))
throw new Exception("ERROR: INLINE FILE");
inlineEditors.Remove(f);
if (inlineEditors.Count == 0)
endEdit(this);
}
//Intended for compressed files like overlays.
//Must decompress the file so it's editable and still playable.
public virtual void enableEdition() { }
public string getPath()
{
return parentDir.getPath() + "/" + name;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBTX/Filepallete.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using NSMBe4.DSFileSystem;
using System.Drawing;
namespace NSMBe4
{
public class FilePalette : Palette
{
File f;
string name;
public FilePalette(File f)
: this(f, f.name)
{
}
public FilePalette(File f, string name)
{
this.f = f;
f.beginEdit(this);
this.name = name;
pal = arrayToPalette(f.getContents());
if (pal.Length != 0)
{
//pal[0] = Color.Transparent;
}
}
public static Color[] arrayToPalette(byte[] data)
{
ByteArrayInputStream ii = new ByteArrayInputStream(data);
Color[] pal = new Color[data.Length / 2];
for (int i = 0; i < pal.Length; i++)
{
pal[i] = NSMBTileset.fromRGB15(ii.ReadUInt16());
}
return pal;
}
public override void save()
{
ByteArrayOutputStream oo = new ByteArrayOutputStream();
for (int i = 0; i < pal.Length; i++)
oo.writeUShort(NSMBTileset.toRGB15(pal[i]));
f.replace(oo.getArray(), this);
}
public override byte[] getRawData()
{
ByteArrayOutputStream oo = new ByteArrayOutputStream();
for (int i = 0; i < pal.Length; i++)
oo.writeUShort(NSMBTileset.toRGB15(pal[i]));
return oo.getArray();
}
public override void close()
{
f.endEdit(this);
}
public override string ToString()
{
return name;
}
}
}
================================================
FILE: DS_Map/LibNDSFormats/NSBTX/NSBTXLoader.cs
================================================
// Loader for NSBTX files/data.
// Code adapted from kiwi.ds' NSBMD Model Viewer.
using System;
using System.Collections.Generic;
using System.IO;
using LibNDSFormats.NSBMD;
using System.Linq;
using System.Windows.Forms;
namespace LibNDSFormats.NSBTX
{
///
/// Loader for NSBTX files & data.
///
public static class NSBTXLoader
{
public static object MessageBoxIcons { get; private set; }
#region Methods (2)
// Public Methods (2)
///
/// Load NSBTX from stream.
///
/// Stream to use.
/// Material definitions.
public static IEnumerable LoadNsbtx(Stream stream, out List texs, out List pals)
{
texs = new List();
pals = new List();
var materials = new List();
var reader = new BinaryReader(stream);
int id = reader.ReadInt32();
if (id != NSBMD.NSBMD.NDS_TYPE_BTX0) {
//Console.WriteLine("The header of this texture file is null!!!");
return null;
}
reader.BaseStream.Position += 2;
int i = reader.ReadUInt16();
if (i == NSBMD.NSBMD.NDS_TYPE_UNK1) {
i = reader.ReadInt32();
if (i == stream.Length) {
int numblock = reader.ReadInt32();
numblock >>= 16;
int r = reader.ReadInt32();
id = reader.ReadInt32();
if (numblock == 1 && r == 0x14) {
int texnum;
int palnum;
materials.AddRange(ReadTex0(stream, 0x14, out texnum, out palnum, out texs, out pals));
}
}
}
return materials;
}
///